groovy被设计为轻量级和容易嵌入到java应用程序系统。
1、groovy脚本样例
def run(foo) {println ´hello world!´x = 123foo * 10}run foo
l groovy脚本样例包含run()函数,并在最后调用run(),返回结果
l 调用run()时传递的参数是foo属性(在运行脚本时,由外部提供属性值)
2、使用groovyshell运行groovy脚本
import groovy.lang.binding;import groovy.lang.groovyshell;import java.io.file;public class embedgroovy {private binding binding = new binding();public object getproperty(string name) {return binding.getproperty(name);}public void setparameters(string[] paramnames, object[] paramvalues) {int len = paramnames.length;if (len != paramvalues.length) {system.out.println("parameters not match!");}for (int i = 0; i < len; i++) {binding.setproperty(paramnames[i], paramvalues[i]);}}
public object runscript(string scriptname) {groovyshell shell = new groovyshell(binding);l groovyshell的evaluate()方法运行指定文件的groovy脚本,并返回运行结果(如果有的话)try {return shell.evaluate(new file(scriptname));} catch (exception e) {e.printstacktrace();return null;}}public static void main(string[] args) {embedgroovy embedgroovy = new embedgroovy();string[] paramnames = { "foo" };object[] paramvalues = { new integer(2) };embedgroovy.setparameters(paramnames, paramvalues);object result = embedgroovy.runscript("src/foo.groovy");system.out.println(result);system.out.println(embedgroovy.getproperty("foo"));system.out.println(embedgroovy.getproperty("x"));}}
l 可以使用binding的setproperty()方法在groovy脚本运行之前设置需要的属性值,在创建groovyshell对象时提供该binding对象
l 同样,可以使用binding的getproperty()方法在groovy脚本运行之后获得指定的属性值,以便在后面的代码中使用
l 注意,在groovy脚本中定义的变量(如x),都可以作为binding中的属性被访问
l 由上面的例子可以看出,在java中运行groovy脚本,既可以输入,又可以有输出;因此,可以将groovy脚本作为功能模块来实现具体功能,以提高编码效率
3、在java中动态加载和运行groovy代码
import groovy.lang.groovyclassloader;import groovy.lang.groovyobject;import java.io.file;public class dynamicgroovy {private groovyobject groovyobject;public object getproperty(string name) {return groovyobject.getproperty(name);}public object invokescriptmethod(string scriptname, string methodname, object[] args) {classloader parent = getclass().getclassloader();groovyclassloader loader = new groovyclassloader(parent);try {class groovyclass = loader.parseclass(new file(scriptname));groovyobject = (groovyobject) groovyclass.newinstance();return groovyobject.invokemethod(methodname, args);} catch (exception e) {e.printstacktrace();return null;}}public static void main(string[] args) {dynamicgroovy dynamicgroovy = new dynamicgroovy();object[] params = {new integer(2)};object result = dynamicgroovy.invokescriptmethod("src/foo.groovy", "run", params);system.out.println(result);system.out.println(dynamicgroovy.getproperty("x"));}}
l 使用groovyclassloader可以在java程序中动态加载groovy类并执行它们(调用其方法)
l groovyclassloader的parseclass()方法解析指定文件的groovy脚本,生成对应的groovy类并加载
l 可以创建groovyobject接口的实例,调用其invokemethod()方法来调用groovy类的方法
l invokemethod()方法的两个参数分别对应groovy类的方法名和传递给该方法的参数列表数组
l 可以使用groovyobject的getproperty()方法获得groovy类的指定属性值
l 这里是直接传递参数值给groovy类的方法,而不象前面一种方式,是通过binding中的属性间接将参数值传递给groovy类的方法