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

如何在Groovy中动态调用方法?,groovy,invoke,dynamicmethod,Groovy,Invoke,Dynamicmethod,在运行时,我获取一个类上的方法名列表,并希望调用这些方法。我理解如何从这里完成第一部分: 我似乎找不到的信息是,一旦我获取了一个方法的名称,如何调用它 我想要的是来到这里: GroovyObject.methods.each{ GroovyObject.invokeMethod( it.name, argList) } 我似乎找不到正确的语法。上面似乎假设我重载了GroovyObject类的默认invokeMethod,这不是我想要的方向 Groovy允许使用扩展运算符进行动态方法调用和动态

在运行时,我获取一个类上的方法名列表,并希望调用这些方法。我理解如何从这里完成第一部分:

我似乎找不到的信息是,一旦我获取了一个方法的名称,如何调用它

我想要的是来到这里:

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

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

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

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


问题已回答。

一旦您从元类中获得了
元方法
对象,您就可以对其调用
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')

虽然这在理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。提供的链接已经失效。这个链接相似吗?我更新了链接,指向原始链接的存档版本,现在是死链接。快乐元编程!有没有一种方法可以在不迭代元类的情况下检查该方法是否存在。methods?@AlexanderSuraphel该方法将告诉您该方法是否存在。示例:
if(test.respondsTo(methodName)){…}
methodName = 'myMethod'
test."$methodName"('bar')