Exécuter du JavaScript en Java
Suite à un sujet sur le forum comp.lang.java.programmer, j'ai fait quelque recherches sur l'exécution de scripts (en particulier JavaScript) dans un environnement Java SE.
L'exécution de scripts dans un environnement Java est fourni par le package
Le but de ce code est de déclarer une méthode qui renvoie le résultat de 4 + 5, puis d'appeler cette méthode.
Voici maintenant l'exécution du même code en Java, en affichant le résultat sur la sortie standard :
Il est également possible de séparer la déclaration de la méthode de l'appel, ce qui permet plus de modularité (par exemple, nous déclarons une méthode une seule fois pour l'appeler plusieurs fois) :
L'exécution de script est donc très simple.
Un petit exemple simple, mettant en scène un
Il est donc possible de modifier des objets Java directement à l'intérieur de notre moteur de script.
Enfin, un dernier point concerne les objets immuables (comme la classe String, par exemple). En effet, une instance de String ne peut pas changer de contenu. Un nouvel objet doit être créé. Dans ce cas, il est possible de récupérer un objet créé dans notre script :
L'exécution de scripts est donc assez aisée dans un environnement Java 6. L'API permettant cette exécution est à la fois simple et puissante, puisqu'elle permet même la modification d'objets Java.
Seul bémol, sur ma machine (JVM 1.6.0_06-b02, sous Linux), il semblerais que le moteur de JavaScript soit le seul disponible...
L'exécution de scripts dans un environnement Java est fourni par le package
javax.script (depuis Java 6). Un moteur de script est défini par l'interface ScriptEngine, dont l'implémentation nous est fournie par la classe ScriptEngineManager.
Voici donc à quoi ressemble l'exécution de code JavaScript dans un environnement Java.1. Exécution simple de script
Dans un premier temps, cet exemple montre comment exécuter un script simple. Le but est d'exécuter le code JS suivant :
function myFunction() {
return (4 + 5);
}
myFunction();
Le but de ce code est de déclarer une méthode qui renvoie le résultat de 4 + 5, puis d'appeler cette méthode.
Voici maintenant l'exécution du même code en Java, en affichant le résultat sur la sortie standard :
public static void main(String[] args) {
try {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String myJSCode = new StringBuffer()
.append("function myFunction() {")
.append("return (4 + 5);")
.append("}")
.append("myFunction();").toString();
System.out.println(engine.eval(myJSCode));
} catch (ScriptException ex) {
ex.printStackTrace();
}
}
Il est également possible de séparer la déclaration de la méthode de l'appel, ce qui permet plus de modularité (par exemple, nous déclarons une méthode une seule fois pour l'appeler plusieurs fois) :
public static void main(String[] args) {
try {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String myJSCode = new StringBuffer()
.append("var i = 12;")
.append("function myFunction() {")
.append("return (i++);")
.append("}").toString();
engine.eval(myJSCode);
System.out.println(engine.eval("myFunction();"));
System.out.println(engine.eval("myFunction();"));
System.out.println(engine.eval("myFunction();"));
} catch (ScriptException ex) {
ex.printStackTrace();
}
}
L'exécution de script est donc très simple.
2. Partage de variables
En plus d'être simple, l'exécution de scripts est également très puissante. Il est possible de partager des références vers des objets entre notre code Java et notre code JavaScript.Un petit exemple simple, mettant en scène un
StringBuffer dans lequel nous allons rajouter des données en JavaScript :
public static void main(String[] args) {
try {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
StringBuffer s = new StringBuffer();
engine.put("s", s);
engine.eval("s.append('toto');");
System.out.println(s.toString());
} catch (ScriptException ex) {
ex.printStackTrace();
}
}
Il est donc possible de modifier des objets Java directement à l'intérieur de notre moteur de script.
Enfin, un dernier point concerne les objets immuables (comme la classe String, par exemple). En effet, une instance de String ne peut pas changer de contenu. Un nouvel objet doit être créé. Dans ce cas, il est possible de récupérer un objet créé dans notre script :
public static void main(String[] args) {
try {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String str = "toto";
engine.put("str", str);
engine.eval("str = str.concat(' tata');");
str = (String) engine.get("str");
System.out.println(str);
} catch (ScriptException ex) {
ex.printStackTrace();
}
}
L'exécution de scripts est donc assez aisée dans un environnement Java 6. L'API permettant cette exécution est à la fois simple et puissante, puisqu'elle permet même la modification d'objets Java.
Seul bémol, sur ma machine (JVM 1.6.0_06-b02, sous Linux), il semblerais que le moteur de JavaScript soit le seul disponible...