如何从Java评估自己的Groovy脚本?
我尝试从Java类调用自己的groovy脚本函数,用户也可以使用标准表达式
例如:
GroovyShell shell = new GroovyShell();
Script scrpt = shell.parse("C:/Users/Cagri/Desktop/MyCustomScript.groovy");
Binding binding = new Binding();
binding.setVariable("str1", "foo");
binding.setVariable("str2", "boo");
scrpt.setBinding(binding);
System.out.println(scrpt.evaluate("customConcat(str1, str2)")); //my custom method
System.out.println(scrpt.evaluate("str1.concat(str2)"));
这是我的自定义脚本。棒极了
def area(def sf) {
Feature f = new Feature(sf);
f.getGeom().area;
}
def customConcat(def string1, def string2) {
string1.concat(string2)
}
运行时,此行scrpt.evaluate("str1.concat(str2)")
按预期工作,但scrpt.evaluate("customConcat(str1, str2)")
引发异常:
groovy.lang.MissingMethodException: No signature of method: Script1.customConcat() is applicable for argument types: (java.lang.String, java.lang.String) values: [foo, boo]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:78)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
at Script1.run(Script1.groovy:1)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518)
我可以像下面这样调用我的自定义方法,它可以正常工作
GroovyClassLoader loader = new GroovyClassLoader();
Class groovyClass = loader.parseClass(new File("C:/Users/Cagri/Desktop/IntergisGroovyScript.groovy"));
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object res = groovyObject.invokeMethod("customConcat", new Object[]{"foo", "boo"});
然而,这次我找不到如何计算标准表达式,如substring、concat等
那么,我应该如何评估定制和标准表达呢
# 1 楼答案
调用
evaluate()
来执行脚本方法是行不通的,因为脚本中定义的方法最终不会出现在绑定中。但是,作为一种解决方法,您可以将脚本(包含方法)存储在绑定中,然后使用该引用执行其方法。以下是我的作品:或者,您可以直接使用
Script.invokeMethod(name, args)
调用脚本的方法