domingo, 3 de abril de 2016

Utilizando lenguajes de Script dentro de Java

Una de las características más interesantes dentro de Java SE 6 es la posibilidad de usar lenguaje de Script (Phyton, PHP, Ruby o Javascript) dentro del propio Java. Este sería el comienzo para la implementación que vendría después en Java 8 que permitiría el uso de Lambda y el motor Nashorn.

¿Para que nos puede servir ejecutar lenguaje de Script dentro de Java? Pues para distintas funcionalidades como puede ser:
  • Tienes una script con una determinada funcionalidad y la quieres usar dentro de Java para evitarte la duplicidad del código o el trabajo extra.
  • Quieres habilitar un mecanismo para que los clientes puedan ejecutar su propio código de Script. 
A continuación indicaremos algunas posibilidades y ejemplos de lo que se puede hacer. Pero si quieres más información aquí tiene la documentación oficial.

Ejemplo 1: Lo más básico, ejecutar javascript:

// Crear el gestor de motores de script
ScriptEngineManager factory = new ScriptEngineManager();
// Crear el motor de Javascript
ScriptEngine jsEngine = factory.getEngineByName("JavaScript");
// Evaluar el código Javascript
jsEngine.eval("print('Hello, World')");

Ejemplo 2: Ejecutar código de un fichero javascript

jsEngine.eval(new java.io.FileReader("/WEB-INF/js/general.js"));

Ejemplo 3: Crear variables y distintos contextos

// Creamos una variable, por defecto es global
jsEngine.put("x", "hello");
// Evalua el código javascript y pinta "hello"
jsEngine.eval("print(x)");
// Creamos un contexto asociado unicamente a este motor de script concreto
ScriptContext newContext = new SimpleScriptContext();
newContext.setBindings(jsEngine.createBindings(), ScriptContext.ENGINE_SCOPE);
Bindings engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE);
// Le damos un valor distinto a la misma variable pero en otro ambito
engineScope.put("x", "world");
// Evaluamos el código anterior e indicamos el nuevo ambito. Pinta "world"
jsEngine.eval("print(x)", newContext);

Ejemplo 4: Invocar funciones y metodos Script

//Creamos una funcion javascript 
String script = "function hello(name) { print('Hello, ' + name); }"
// eevaluamos el script
jsEngine.eval(script);
// javax.script.Invocable is opcional y puede no setar implementada para todos los motores de script
Invocable inv = (Invocable) jsEngine;
// Invocamos la funcion global 'hello' e indicamos su parametro de entrada
inv.invokeFunction("hello", "Scripting!!");

Ejemplo 5: Ejecución de código compilado

//Compilable soporta la re-ejecucion de codigo previamente compilado
Compilable jsCompilable = (Compilable) jsEngine;
CompiledScript script = jsCompilable.compile("function test() { return 10; }; test();");
//Évaluamos el codigo compilado
Object compiledOutput = script.eval();
//Podemos hacer uso del codigo compilado cada vez que queramos
System.out.println(compiledOutput); 

No hay comentarios:

Publicar un comentario