如何从Java调用groovy类的方法 - 字符串格式的方法名称和参数

时间:2016-06-03 06:47:42

标签: java methods groovy

我有一个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" )"

然后我该如何调用此方法?

1 个答案:

答案 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