【发布时间】:2016-08-30 11:55:31
【问题描述】:
我在 Grails Web 应用程序中使用 Groovy 2.4.3。我在其中声明了以下特征/类层次结构:
trait GuidData {
String Guid
}
class Enrollment implements GuidData {
String email
}
当我执行以下代码时,我得到了预期的结果:
Enrollment enrollment = new Enrollment(email: "joe@tester.com", guid: "XXXX")
assert enrollment.properties == ['email':'joe@tester.com', 'guid':'XXXX']
assert enrollment.getProperty("guid") == "XXXX")
Enrollment.getDeclaredField("email") == private java.lang.String Enrollment.email
但是当我执行方法时:
Enrollment.getDeclaredField("guid")
我得到一个 NoSuchFieldException。如果我为“getEmail”方法执行“getDeclaredMethod()”,我正确地得到了一个 java.reflect.Method 实例。
所以...看起来,在 trait 中定义的 Groovy 属性显示为 Groovy 属性,并且可以像在父类中定义的属性一样被引用,但它们并不反映为标准 Groovy 属性中带有 getter/setter 的字段图案。换句话说,如果属性出现在对 getProperties() 的实例调用中,我希望反射调用能够使字段定义也能正常工作。
【问题讨论】:
-
你的意思是
Enrollment.getDeclaredField("guid")抛出NoSuchFieldException? -
是的。 Enrollment.getDeclaredField("guid") 抛出 NoSuchFieldException。
标签: grails reflection groovy traits