13

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

GroovyObject.methods.each{ println it.name }

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

我想要的是到达这里:

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

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

4

2 回答 2

22

一旦你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')
于 2012-01-03T18:51:13.123 回答
18

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

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

参考这里

问题在这里回答。

于 2012-01-03T17:16:37.900 回答