我有一个Java程序,它接受以下格式的字符串输入:
setData("hello")
另外,我有一个groovy脚本说" sample.groovy ",它是一个groovy文件,采用以下示例格式:
class sample { def doOperation() { println("Inside doOperation()") } def setData(String str) { println("Incoming data : " + str) } }
从Java类中,创建一个名为:sampleObj。
的groovy类的对象我必须使用输入字符串来调用我的Java应用程序中的 sampleObj.setData(" hello")" setData(" hello" )"
然后我该如何调用此方法?
答案 0 :(得分:2)
这正是GroovyShell解决的问题。
以下是一个例子:
import groovy.transform.Canonical
import org.codehaus.groovy.control.CompilerConfiguration
@Canonical
class ScriptState {
String data
}
abstract class MyScript extends Script {
void setData(String data) {
binding.state.data = data
}
}
def state = new ScriptState()
def cc = new CompilerConfiguration(scriptBaseClass: MyScript.class.name)
def shell = new GroovyShell(MyScript.classLoader, new Binding(state: state), cc)
shell.evaluate('println "Running script"; setData "The Data"')
assert state.data == 'The Data'
println state
运行它将打印:
Running script
ScriptState(The Data)
我将此示例基于Groovy Goodness示例。
通常,你不需要像我在MyScript.classLoader
那样设置类加载器......我只需要这样做,因为我把它作为一个脚本运行,脚本类对于脚本类是不可见的如果我不这样做的话,GroovyShell的脚本类加载器。
修改强>
在对问题进行大量编辑之后,似乎问题是您不知道从脚本调用的Java对象将使用哪个类。
在这种情况下,只需更改MyScript
类即可执行以下操作:
abstract class MyScript extends Script {
def methodMissing(String name, args) {
// this will call any method called inside the script
// on the sample Object
binding.sampleObject."$name"(*args)
}
}
现在,在创建GroovyShell时:
def shell = new GroovyShell(
MyScript.classLoader,
new Binding(sampleObject: new Sample()),
cc)
运行此代码:
shell.evaluate('doOperation(); setData "The Data"')
将打印预期的:
Inside doOperation()
Incoming data : The Data