Interprite un morcaux de code dans une application java

soubonoi Messages postés 48 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention   9
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention   9
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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