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 では、spread operator を使用して動的メソッド呼び出しと動的引数を使用できます。

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

ここを参照

質問はここで答えました。

于 2012-01-03T17:16:37.900 に答える