2016-02-28 40 views
1

在groovy中,.&运算符在闭包中转换方法。在使用反射Method对象的Java中,可以获取方法名称,参数名称和类型。有没有办法从闭包中获得所有的方法反射信息?我只能够得到的参数类型至今(通过closure.parameterTypes从Groovy方法关闭中获取方法

+0

没有你不能。你需要使用反射 –

回答

1

当您通过Method创建闭包时,您并不真正链接java.lang.Method,但只有一个名称:如果您有不同的方法具有相同的名称,但参数不同,它将起作用。

当您使用参数调用闭包时,groovy会尝试查找适合参数的最佳方法(如Groovy中一样)。

所以,你不能从一个封闭一个Method,但你可以得到名称:

def closure = [email protected] 
assert "myMethod" == closure.method 

然后,您可以找到从owner类的所有可能的方法:

def methods = closure.owner.metaClass.respondsTo(closure.owner, closure.method) 
+0

groovy编译器支持-parameters选项吗? – Antonio

1

不是直接从Closure,但你可以从的ClosureMethod

import java.lang.reflect.Method 

class Person { 
    def firstName 
    def lastName 

    def getFullName() { 
     "$firstName $lastName" 
    } 
} 

Person person = new Person(firstName: 'John', lastName: 'Doe') 
Closure closure = person.&getFullName 
Method method = closure.owner.class.getMethod('getFullName') 

assert person.fullName == closure() 
assert person.fullName == method.invoke(person) 

的。 &运算符返回MethodClosure,该值保留对owner属性中实例的引用。所以你可以从那里去,到Class,最后到Method