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