Vraag Hoe kan ik dynamisch methoden in Groovy aanroepen?


Tijdens runtime pak ik een lijst met methodenamen in een klasse en ik wil deze methoden gebruiken. Ik begrijp hoe ik het eerste stuk vanaf hier kan krijgen: http://docs.codehaus.org/display/GROOVY/JN3535-Reflection

GroovyObject.methods.each{ println it.name }

Waar ik geen informatie over kan vinden, is hoe ik vervolgens een methode kan aanroepen zodra ik de naam heb gepakt.

Wat ik wil is om hier te komen:

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

Ik kan de juiste syntaxis niet vinden. Het bovenstaande lijkt aan te nemen dat ik de standaard invokeMethod voor de GroovyObject-klasse heb overbelast, wat NIET de richting is die ik wil gaan.


12
2018-01-03 17:05


oorsprong


antwoorden:


Zodra je een hebt MetaMethod object uit de meta-klasse, je kunt bellen invoke ben ermee bezig. Bijvoorbeeld:

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')
    }
}

U kunt ook de naam rechtstreeks gebruiken:

methodName = 'myMethod'
test."$methodName"('bar')

17
2018-01-03 18:51



Groovy maakt dynamische methode-aanroep mogelijk, evenals dynamische argumenten met behulp van de spread-operator:

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

Referentie hier

Vraag beantwoord hier.


14
2018-01-03 17:16