首先介绍Groovy的几种集成方式:groovyshell、GroovyClassLoader、GroovyScriptEngine
①groovyshell的方式不支持脚本缓存,会导致垃圾回收频繁,并且会出现outofmemoryexception
②GroovyClassLoader、③GroovyScriptEngine
两者性能上比较接近
直接上代码解释:
①groovyshell 静态加载groovy
//直接运行groovy脚本语句,不推荐
public static void test() {
GroovyShell shell = new GroovyShell();
String groovyExl = "println 'hello First blood'";
shell.evaluate(groovyExl);
}
下面两种动态加载groovy文件
②GroovyClassLoader
//这是一个接口
public interface IFoo {
public Object run(Object foo, Object bar);
}
//使用创建一个groovy实现IFoo
class Foo implements IFoo{
def x
@Override
Object run(Object foo, Object bar) {
println 'Hello World!'
x = 123
println foo * 10
println bar
return 'success'
}
//当然在idea中也可以直接执行
public static void main(String[] args) {
Foo f = new Foo();
f.run('test','well')
}
}
//最关键的InvokeGroovy
public class InvokeGroovy {
public static void main(String[] args) {
ClassLoader cl = new InvokeGroovy().getClass().getClassLoader();
GroovyClassLoader groovyCl = new GroovyClassLoader(cl);
System.out.print("\033[35;1m"); //可以更换控制台输出语句颜色
try {
@SuppressWarnings("rawtypes")
// Class groovyClass = groovyCl.parseClass(
// new File(InvokeGroovy.class.getResource("/production/firstGroovy/groovy/Foo.class").toURI()));
/** 路径问题:
* 注意class.geResource()以及classLoader.getResource的问题
* 使用上面获取路径本人在idea中还未成功,
* 如果有朋友解决,回我一下,我的路径获取很糟糕。。。
* 使用class.geResource()一直空指针
*/
Class groovyClass = groovyCl.parseClass(
new File("src/groovy/Foo.groovy"));
IFoo foo = (IFoo) groovyClass.newInstance();
System.out.println(foo.run(
new Integer(2), "More parameter..."));
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
System.out.println(groovyObject.invokeMethod("run",
new Object[]{new Integer(2),"More parameter..."}));
} catch (Exception e) {
e.printStackTrace();
}
}
}
③GroovyScriptEngine
public static void main(String[] args) throws Exception {
String[] roots = new String[]{"src/groovy/"};
GroovyScriptEngine groovyScriptEngine = new GroovyScriptEngine(roots);
Binding binding = new Binding();
binding.setVariable("input", "lucas");
groovyScriptEngine.run(" a.groovy ", binding);
System.out.println(binding.getVariable("output"));
}
//src/groovy下的a.groovy文件内容是单纯的groovy脚本 : output = "Hello, ${input}!"
初学还有很多很要踩啊!!