domingo, 20 de enero de 2013

Groovy y Java - Embeded groovy

Un punto que considero muy interesante es el poder ejecutar scripts o clases groovy desde java, por este motivo he estado realizando algunas pruebas.

La primera prueba que he realizado ha sido la de ejecutar un método de una clase groovy dentro de un main de java.

En concreto he creado la clase "HelloGroovy.groovy":

package main

class HelloGroovy {
 
 
 public String getHello(){
  return "Hello from groovy class";
 }
}
Y después una clase Java que llama al método "getHello", la clase "EmbeddedGroovy.java":


package main
package main;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;

import java.io.File;

public class EmbeddedGroovy {
 
 
 public static void main(String args[])throws Exception{
  ClassLoader parent = EmbeddedGroovy.class.getClassLoader();
  GroovyClassLoader loader = new GroovyClassLoader(parent);
  Class helloGroovyClass = loader.parseClass(new File("src/main/HelloGroovy.groovy"));
  GroovyObject groovyObject = (GroovyObject) helloGroovyClass.newInstance();
  Object[] arguments = {};
  String hello = (String)groovyObject.invokeMethod("getHello", arguments);
  System.out.println(hello);
 }

}


Como se puede apreciar esta llamada es muy parecida a la que se haría si la clase en lugar de ser de tipo groovy fuera java, pero existen otras manera de invocar a scripts groovy muy interesantes por ejemplo utilizando GroovyScriptEngine, de esta manera se puede ejecutar un script groovy dentro de una clase java tal y como se muestra en el siguiente ejemplo.

Script groovy hello.groovy:

println("Hello World");

Y la clase java ExecuteGroovyScript.java:


package main;

package main;

import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;

public class ExecuteGroovyScript {
 
 public static void main(String args[])throws Exception{
  String[] scripts = new String[] { "src/main" };
  GroovyScriptEngine gse = new GroovyScriptEngine(scripts);
  Binding binding = new Binding();
  gse.run("hello.groovy", binding);
 }

}

Al ser totalmente interpretado dota a java de la posibilidad de modificar script groovy y afectar al programa que lo incorpora sin necesidad de compilar, es más tal y como se muestra en la página http://groovy.codehaus.org/Embedding+Groovy existe la posibilidad de pasar parámetros a los scripts.
En la página mencionada anteriormente también describe un ejemplo básico utilizando la shell de groovy.