2011-09-01 4 views
1

je rencontre cette question lors du calcul du prix d'un produit, mais la formule des changements presque tous les jours en raison des systèmes de commercialisation, réductions, taxes ...Exécuter le script dans le programme Java lors de l'exécution

Je pense que ce serait génial si je pouvais écrire du code comme le code ci-dessous, afin que je puisse changer le script à l'exécution.

public BigDecimal calculate(String script) { 
    return (BigDecimal) ScriptEngine.execute(script); 
} 

Y a-t-il un moyen de l'implémenter en utilisant Java?

Répondre

3

Oui: Utilisez le Scripting API.

Il existe des implémentations pour exécuter des scripts écrits en JavaScript, Groovy, Python et beaucoup d'autres langages.

[EDIT]

Comme il a été mentionné dans les commentaires: Méfiez-vous des problèmes de sécurité.

Il y a plusieurs options:

  1. Vous autorisez les clients finaux de fournir des scripts (par exemple dans un formulaire web)
  2. Vous ne permettent pas aux clients de fournir des scripts; Si un script doit être modifié, un administrateur ou un développeur doit démarrer un outil spécifique.
  3. Vous développez un système qui ne permet d'exécuter des scripts « sûrs »

Option n ° 3 ne fonctionne pas (= ne fonctionne que pour les cas les plus simples). Il existe une preuve mathématique qu'un programme informatique ne peut jamais dire ce qu'un autre programme peut potentiellement faire sans l'exécuter réellement.

Donc vous pouvez vous en sortir avec l'option # 3 si vous ne permettez pas d'appeler des méthodes (ou seulement un très, très limité ensemble de méthodes). Mais la plupart des langages de script permettent d'accéder aux classes Java ce qui signifie que vous pouvez éventuellement obtenir System.exit() ou Runtime.exec(). Cela signifie que vous devez écrire un analyseur qui s'assure que le code ne contient pas quelque chose d'étrange.

Ce que vous devrez mettre à jour tous les jours parce que les clients viendront avec de nouveaux ... err ... intéressant façons d'utiliser la fonctionnalité.

Il est également possible que vous fassiez une erreur - soit l'analyseur n'acceptera pas d'entrée valide, soit il laissera passer un code malveillant. Compte tenu de la complexité du problème, la chance est comprise entre 99,9999% et 100%. L'option n ° 1 signifie pas de sécurité du tout, mais après le troisième changement, les clients vous réprimanderont de l'adopter. Cela fonctionnera pendant un certain temps jusqu'à ce que le premier script kiddie arrive et ruine tout. Devinez qui sera la faute? Le directeur qui a embauché son neveu ... le gamin? Donc, un humain devra regarder les scripts, corriger tous les bogues et configurer le système pour les exécuter. L'option 2 causera toutes sortes de chagrins, mais elle causera moins de chagrin, tout bien considéré.

+2

Ceci est correct, mais il serait bon de dire un mot ou un autre concernant la sécurité. Je préfère ne pas lancer la chaîne "Runtime.exec (\" rm -rf $ HOME \ ");" – Ingo

+0

Oui, bien sûr, je dois prendre soin de la sécurité. –

+0

J'ai ajouté un peu de sécurité. Prenez-le avec un grain de sel. –

0

Bien sûr, voir Mozilla Rhino

+0

Votre réponse serait encore plus utile si vous pouviez résumer rapidement ce qu'est Mozilla Rhino. Je sais que le site Web fait cela dans son titre, mais: Imaginez qu'il y ait beaucoup de réponses ici, comme la vôtre, avec seulement des liens dedans; pas d'explications du tout. Comprendre toutes ces réponses prendrait beaucoup plus de temps que nécessaire. – stakx

1

Quelle langue voulez-vous "script" être?Une façon de procéder serait d'utiliser Javascript, et d'utiliser une bibliothèque comme Rhino. Cela vous permettra d'exécuter certains JS et d'obtenir la sortie dans votre code.

http://www.mozilla.org/rhino/

0

Vous pouvez utiliser beanshell.jar - Il est une coquille autonome aussi bien, mais peut facilement être utilisé pour exécuter du code non compilé java lors de l'exécution.

Questions connexes