2015-01-21 49 views
0

這是怎麼回事?Groovy反射與封閉

import java.lang.reflect.Method 

class MyClass{ 

    String method1(Closure c){ 
    println 'method' 
    c() + ' method 1' 
    } 
    String method2(){ 
    println 'method' 
    'method 2' 
    } 
} 


def m = new MyClass() 
def c = {'closure'} 

println m.method1(c) 

Method mr2 = MyClass.getMethod('method2') 
println mr2 

println mr2.invoke(m) 
println '---' 

Method mr1 = MyClass.getMethod('method1', c) 
println mr1 

println mr1.invoke(m) 
println '---' 

closure method 1 
public java.lang.String MyClass.method2() 
method 2 
--- 
groovy.lang.MissingMethodException: No signature of method: static MyClass.getMethod() is applicable for argument types: (java.lang.String, Script1$_run_closure1) values: [method1, [email protected]] 
Possible solutions: method2() 
    at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1367) 
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1353) 
    at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120) 
    at Script1.run(Script1.groovy:27) 
. 
. 
. 

最終我希望能夠拾取與反射該方法後通過一個常規封閉件爲java方法,但我不能產生本(在詹金斯常規控制檯)似乎與封閉的parmeter獲得方法

回答

0

你需要改變:

Method mr1 = MyClass.getMethod('method1', c) 
println mr1 

println mr1.invoke(m) 

收件人:

Method mr1 = MyClass.getMethod('method1', Closure) 
println mr1 

println mr1.invoke(m, c) 
+0

謝謝,並確定它是否與此'println Closure.isAssignableFrom(c.class) – KeepCalmAndCarryOn 2015-01-21 20:27:04