如何在Groovy中动态调用方法?

时间:2012-01-03 17:05:08

标签: groovy invoke dynamicmethod

在运行时我正在抓取类的方法名列表,我想调用这些方法。我理解如何从这里完成第一部分: http://docs.codehaus.org/display/GROOVY/JN3535-Reflection

GroovyObject.methods.each{ println it.name }

我似乎无法找到有关如何在获取其名称后调用方法的信息。

我想要的是到达这里:

GroovyObject.methods.each{ GroovyObject.invokeMethod( it.name, argList) }

我似乎无法找到正确的语法。上面似乎假设我已经重载了GroovyObject类的默认invokeMethod,这不是我想要的方向。

2 个答案:

答案 0 :(得分:18)

从元类中获取MetaMethod对象后,您可以在其上调用invoke。例如:

class MyClass {
    def myField = 'foo'
    def myMethod(myArg) { println "$myField $myArg" }
}
test = new MyClass()
test.metaClass.methods.each { method ->
    if (method.name == 'myMethod') {
        method.invoke(test, 'bar')
    }
}

或者,您可以直接使用该名称:

methodName = 'myMethod'
test."$methodName"('bar')

答案 1 :(得分:14)

Groovy允许使用扩展运算符进行动态方法调用以及动态参数:

def dynamicArgs = [1,2]
def groovy = new GroovyObject()
GroovyObject.methods.each{ 
     groovy."$it.name"(staticArg, *dynamicArgs)
}

参考here

问题回答here