说明
GroovyClassLoader
是Java的groovy库提供的类。该类可以动态将Groovy文件解析为class文件,从而可以调用其中的方法。
由于Groovy是脚本文件,Java是无法得知其类定义的,因此只能动态得到一个Class文件,而无法得到具体的类定义。如下面的例子,直接在Java代码中使用GMath
类是非法的,因为Java并不知道GMath
类的定义。
故而,只能通过Class.newInstance()
方法来创建一个Object
实例,然后强转为GroovyObject
类型来使用。
使用
GroovyClassLoader
的思路为:
- 将.groovy文件加载为File对象。
- 创建GroovyClassLoader对象。
- 用GroovyClassLoader对象来将File对象解析为Class对象。
- 调用Class对象的
newInstance()
方法来获取实例,并强转为GroovyObject
类型。 - 通过
GroovyObject.invokeMethod()
来调用指定的方法。
实例
.groovy文件的加载和调用类:
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyCodeSource;
import groovy.lang.GroovyObject;
import java.io.File;
public class GroovyUtil {
/**
* 加载Groovy文件,返回GroovyObject对象
* @param file
* @return
*/
static GroovyObject getGroovyObject(File file) {
GroovyObject groovyObject = null;
try {
GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader());
Class clazz = classLoader.parseClass(new GroovyCodeSource(file));
groovyObject = (GroovyObject)clazz.newInstance();
} catch (Exception e) {}
return groovyObject;
}
static GroovyObject getGroovyObject(String filePath) {
return getGroovyObject(new File(filePath));
}
/**
* 执行GroovyObject对象的方法
* @param name
* @param args
* @return
*/
static Object invokeMethod(GroovyObject groovyObject, String name, Object args) {
return groovyObject.invokeMethod(name, args);
}
}
定义一个.groovy文件:
class GMath {
int add(a, b) {
return a+b;
}
}
使用:
String path = "./src/Groovy/GMath.groovy";
List<Integer> params = new ArrayList<Integer>();
params.add(1);
params.add(2);
GroovyObject groovyObject = GroovyUtil.getGroovyObject(path);
Integer r = (Integer)groovyObject.invokeMethod("add", params);
System.out.println(r); // 输出 3