简体   繁体   English

带封闭的Groovy反射

[英]Groovy reflection with a closure

What is going on here? 这里发生了什么?

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

which produces this (in the Jenkins groovy console) 产生这个的(在Jenkins groovy控制台中)

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, Script1$_run_closure1@1242bced]
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)
.
.
.

Ultimately I want to be able to pass a groovy closure into a java method after picking the method with reflection but I can't seem to get the method with a closure as a parmeter 最终,我希望能够在使用反射选择方法后将groovy闭包传递给java方法,但是我似乎无法获得以闭包作为参数的方法

You need to change: 您需要更改:

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

println mr1.invoke(m)

To: 至:

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

println mr1.invoke(m, c)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM