2016-02-28 49 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