Interprite un morcaux de code dans une application java

Fermé
soubonoi Messages postés 48 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 20 décembre 2016 - 2 sept. 2015 à 00:51
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 4 sept. 2015 à 18:31
Bonjour,

je suis entrain d'Ecrire une application de comptabilité en java; mais je veut que les formules de calcule sont dynamique ( entrée par l'utilisateur final)
et pour fait sa je donne a l'utilisateur une zone de texte pour Ecrire un code en java et l'application interprète ce code.
es-que il y a une fonction qui compile en dynamique un morceaux de code java
merci d'avance

A voir également:

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 2/09/2015 à 05:35
Bonjour,

Pour interpréter un morceau de code Java il faudrait d'abord le compiler, c'est un peu lourd. Plus simplement tu pourrais écrire tes formules en JavaScript et utiliser la classe ScriptEngine pour l'interpréter.

package test;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Test {
    public static void main(String[] args) throws ScriptException {
        ScriptEngine js = new ScriptEngineManager().getEngineByName("js");
        String script = "a=2; b=3; c=5; a+b*c";
        double result = (double) js.eval(script);
        System.out.println(result); // 17.0
    }
}

Evidemment, tu pourras écrire le script dynamiquement et gérer autant de variables que tu veux, ainsi qu'utiliser la classe Math de JavaScript.La confiance n'exclut pas le contrôle
0
soubonoi Messages postés 48 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 20 décembre 2016 9
4 sept. 2015 à 12:17
merci beaucoup KX ça fait l'afair mais : je veut savoir comment passe en paramètre un variable extree de la base de donner de l'application ,
aussi la fonction getEngineByName() prendre en paramètre :"js" ou "javascript" ou "nashorn"
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 sept. 2015 à 13:15
Pour passer un paramètre, tu peux le mettre dans le String.

Exemple :

String valeur = extraireDeLaBaseDeDonnees();
String script = "param = "+valeur+"; ... ...";

Pour le getEngineByName, ce sont des alias, au final c'est le même ScriptEngine qui sera utilisé (Oracle Nashorn). Tu peux afficher les ScriptEngine disponibles et leurs alias avec ce code (ça peut changer d'une version à l'autre de Java).

ScriptEngineManager sem = new ScriptEngineManager();
for (ScriptEngineFactory sef : sem.getEngineFactories())
    System.out.println(sef.getEngineName()+": "+sef.getNames());

Chez moi ça donne ça :
Oracle Nashorn: [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript]

Donc que tu utilises "js", "javascript", ou "nashorn", c'est pareil.
0
soubonoi Messages postés 48 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 20 décembre 2016 9
Modifié par soubonoi le 4/09/2015 à 18:10
merci ci presque se que je veut,mais le scripte et entrée par l'utilisateur il faut que je donne a l' etulisteur la main pour accéder au champs courant de la base employer de la base par exemple.
ou bien montrer mois comment passer au scripte de l'etulisateur un tablaux qui port les champs de lenregistrement courant de la table emploiyer par exemple.
et merci d'avance.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 sept. 2015 à 18:31
Le script est en JavaScript, tu peux donc créer un tableau, mais il faut le faire en JavaScript en manipulant ton String dans ton code Java.

Tu peux créer des variables dans ton script, autant que tu veux, et avec n'importe quel nom. Si par exemple tu as dans ta table EMPLOYEUR des colonnes qui s'appellent NOM et ADRESSE, tu peux autoriser l'utilisateur à manipuler des variables nom et adresse que tu rempliras.

Exemple :

String name;
String address;
//... Partie base de données qui récupères les valeurs de 'name' et 'address'

String initScript = "nom = '"+name+"'; adresse = '"+address+"' ; ";

String userScript;
//... Demande un script à l'utilisateur ('nom' et 'adresse' sont connus)

String script = initScript + userScript;
js.eval(script);

Remarque : il faudra faire attention avec les valeurs récupérées en base de données, si elles contiennent des apostrophes cela va casser le String initScript, et donner un peu n'importe quoi.

Exemple : si
name="abcd' efgh="
et
address="ijkl"
tu aurais,
subscript
qui vaut
nom = 'abcd' efgh'; adresse = 'ijkl' ; 

C'est un script qui va planter. Pour éviter ça tu peux faire par exemple un
replace("'","\\'")
sur chaque paramètre que tu ajoutes au script (nom et adresse dans l'exemple), ce qui donnerait
nom = 'abcd\' efgh'; adresse = 'ijkl' ; 
l'apostrophe sera bien conservée et le script sera correct.
0