miércoles, 2 de diciembre de 2009

Scripting en Java

Desde la versión 6, Java incorpora el API de scripting para permitir la ejecución de scripts desde programas Java. Aunque existen múltiples lenguajes disponibles (Javascript, Python, Groovy, etc..), en el JDK únicamente se incorpora el motor de Javascript Mozilla Rhino

En este primer ejemplo vamos a mostrar los motores disponibles y sus múltiples nombres, es decir, los nombres con los que podemos obtener ese motor.

import java.util.List;

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

public class SimpleTest{
public static void main(String[] args) throws ScriptException{
ScriptEngineManager manager = new ScriptEngineManager();

List factories = manager.getEngineFactories();

for(ScriptEngineFactory sef : factories){
System.out.println(sef.getNames());
}
}
}

En este segundo ejemplo ejecutamos un script que muestra un saludo y seguidamente evaluamos una función para ser llamada posteriormente pasandole un parámetro.

ScriptEngine js = manager.getEngineByName("js");
js.eval("println('Hola Mundo !');");
js.eval("function holaMundo(msg){" +
" println('Hola Mundo desde funcion: ' + msg);" +
"}");
Invocable invocable = (Invocable)js;
invocable.invokeFunction("holaMundo", "¡parametro desde Java!");

El casting a Invocable es necesario porque es una interface opcional. Normalmente se debería consultar su disponibilidad con el operador instanceof.

La llamada a funciones no solo puede recibir argumentos sino que también podemos recoger sus valores de retorno tal como se muestra a continuación:

js.eval("function suma(a,b){" +
" return a+b;" +
"}");

Invocable invocable = (Invocable) js;
double total = (Double)invocable.invokeFunction("suma", 2,3);
System.out.println(total);

Los objetos Java de nuestra aplicación pueden ser puestos a disposición de los scripts tanto para su uso como modificación:

Point punto = new Point(2,3);
js.put("punto",punto);

js.eval("println(punto);");
js.eval("println('X: ' + punto.x + ' Y: ' + punto.getY());");
js.eval("punto.setLocation(5,6)");

System.out.println(punto.toString());

En este último ejemplo comprobamos el uso de otro tipo de objetos, en este caso colecciones:

List ides = Arrays.asList("Eclipse","Netbeans","IntelliJIdea",
"JDeveloper");

js.put("ides",ides);

js.eval("println(ides);");

js.eval("var i;" +
"var idesArray = ides.toArray();" +
"for(i in idesArray) {" +
" println(idesArray[i]);" + "}");

1 comentario:

JAVAMAN dijo...

Interesante el tema y Buen BLOGs ..! aqui les comparto un par más ...

Saludos

http://viviendoconjavaynomoririntentandolo.blogspot.com
http://frameworksjava2008.blogspot.com