如果想在Java代码中嵌入Groovy代码,目前主要有三种方式。
GroovyShell
1 | import groovy.lang.Binding; |
结果输出为:
Hello Groovy!
通过Binding类来设置参数,然后将其作为参数来构造一个GroovyShell实例,通过evaluate方法来执行一段GroovyScript。
evaluate方法不仅可以执行一段GroovyScript,也可以执行一个Groovy文件。
Foo.groovy
1 | class Foo { |
Groovy.java
1 | import groovy.lang.Binding; |
输出结果为:
Hello Groovy!
Groovy文件必须定义main方法,否则将报错。
Exception in thread “main”
GroovyScriptEngine
GroovyScriptEngine是比GroovyShell更完整的一个方案,我们指定脚本文件所在的目录,然后在运行时传入目录下脚本的文件名以及所需参数即可。
示例代码:
Foo.groovy
1 | println "$arg" |
GroovyScriptEngineTest.java
1 | public class GroovyScriptEngineTest { |
输出结果为:
Hello Groovy!
在这个示例中,我们没有通过Binding来进行传值,而是直接传入一个字符串,所以Foo.groovy脚本中必须使用arg参数,这是GroovyScriptEngine类中的run方法强制规定的。
源码如下:
1 | public String run(String scriptName, String argument) throws ResourceException, ScriptException { |
我们可以看到,如果run方法传入第二个参数为String类型,那么代码
binding.setVariable("arg", argument);
中强制规定了Groovy脚本必须有一个arg参数。
当然,如果要传多个参数的话,还是要通过Binding,就好像Android里的ContentValues类或者Bundle类一样。
GroovyClassLoader
第一种方法
通过GroovyClassLoader加载Groovy类并且调用该类的方法
示例代码:
Foo.groovy
1 | class Foo{ |
InvokeGroovy.java
1 | import groovy.lang.GroovyClassLoader; |
输出结果为:
Hello Groovy!
通过GroovyObject的invokeMethod方法调用Groovy类中的方法,第一个参数为方法名,第二个参数为所调方法的参数。
第二种方法
定义一个Java接口,再定义一个实现该接口的Groovy类,通过GroovyClassLoader加载Groovy类,然后直接调用该接口方法即可。
代码示例:
IFoo.java
1 | // 定义一个Java接口 |
Foo.groovy
1 | // 实现IFoo接口的Groovy类 |
InvokeGroovy.java
1 | import groovy.lang.GroovyClassLoader; |
输出结果为:
Hello Groovy!