【问题标题】:Get Method from Groovy method closure从 Groovy 方法闭包中获取方法
【发布时间】:2016-02-28 01:58:44
【问题描述】:

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

【问题讨论】:

  • 不,你不能。你需要使用反射

标签: reflection groovy


【解决方案1】:

当你从一个方法创建一个闭包时,你并没有真正链接一个java.lang.Method,而只是一个名字:如果你有不同的方法,名字相同,但参数不同,它会起作用。

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

因此,您无法从闭包中获得Method,但您可以获得名称:

def closure = instance.@myMethod
assert "myMethod" == closure.method

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

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

【讨论】:

  • groovy 编译器是否支持 -parameters 选项?
  • instance.@myMethod --> 你不是说instance.&myMethod 吗?
【解决方案2】:

不是直接来自Closure,但你可以得到Method来自Closure

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

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2013-07-14
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多