如何在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')