【问题标题】:How do I dynamically invoke methods in Groovy?如何在 Groovy 中动态调用方法?
【发布时间】:2012-01-03 17:05:07
【问题描述】:

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

GroovyObject.methods.each{ println it.name }

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

我想要到达这里:

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

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

【问题讨论】:

    标签: groovy invoke dynamicmethod


    【解决方案1】:

    一旦你从元类中得到一个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')
    

    【讨论】:

    • 有没有办法在不迭代metaClass.methods的情况下检查方法是否存在?
    • @AlexanderSuraphel respondsTo() 方法会告诉您该方法是否存在。示例:if (test.respondsTo(methodName)) { ... }
    【解决方案2】:

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

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

    参考here

    问题已回答here

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2013-07-17
    • 1970-01-01
    • 2011-05-12
    • 2020-04-06
    • 2010-09-21
    相关资源
    最近更新 更多