gpt4 book ai didi

grails - 如何获取从 Groovy 特征继承的属性的 java.reflect.Field 值?

转载 作者:行者123 更新时间:2023-12-02 14:22:35 24 4
gpt4 key购买 nike

我在 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 实例。

所以......似乎在特征中定义的 Groovy 属性显示为 Groovy 属性,并且可以像在父类中定义的属性一样被引用,但它们在标准 Groovy 属性模式中并不反射(reflect)为带有 getter/setter 的字段。换句话说,如果属性出现在对 getProperties() 的实例调用中,我希望反射调用能够使字段定义也能正常工作。

最佳答案

来自 Groovy documentation on Traits ,特别是在公共(public)领域(如下伯特所述,这也适用于属性):

…in order to avoid the diamond problem, field names are remapped in the implementing class…



它继续:

The name of the field depends on the fully qualified name of the trait. All dots (.) in package are replaced with an underscore (_), and the final name includes a double underscore. So if the type of the field is String, the name of the package is my.package, the name of the trait is Foo and the name of the field is bar, in the implementing class, the public field will appear as: String my_package_Foo__bar.



所以对于 Enrollment实现 GuidData 的类,它没有名为 Guid 的字段,它有一个名为 GuidData__Guid 的字段(假设 Enrollment 不在包中)。这就是您遇到 NoSuchFieldException 的原因.这应该有效:
Enrollment.getDeclaredField("GuidData__Guid")
Enrollment类确实有 getter/setter String getGuid() , void setGuid(String arg1) ,这就是您能够使用常规属性访问器或使用常规 getter 语法访问它的方式。

关于grails - 如何获取从 Groovy 特征继承的属性的 java.reflect.Field 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37037985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com