2015-01-21 53 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