gpt4 book ai didi

grails - 访问 Grails 域类上的字段注释

转载 作者:行者123 更新时间:2023-12-02 14:42:09 25 4
gpt4 key购买 nike

我正在尝试在我的域类上注释字段,但我无法像通常的 Java 字段一样在运行时通过反射来获取它们。

我带注释的域类如下所示:

class MyDomainClass {
@MyAnnotation
String myField
}

Java访问 myField的方式通过反射不起作用:
MyDomainClass.class.getField("myField") //throws java.lang.NoSuchFieldException

Grails 检查域类的方法不公开字段注释:
new DefaultGrailsDomainClass(MyDomainClass).getPersistentProperty("myField").??? //there is nothing similar to getAnnotations()

如何检索与域字段关联的注释?

最佳答案

那不是一个字段,它是一个属性。当您在 Groovy 类中声明一个没有范围修饰符( publicprotected 等)的类范围变量时,Groovy 编译器会将其转换为具有相同类型和名称的私有(private)字段以及一个 getter和setter方法,本质上

class MyDomainClass {
@MyAnnotation
private String myField

public String getMyField() {
return myField
}
public void setMyField(String s) {
myField = s
}
}

但它不会覆盖现有的 getter 或 setter。

当您访问该属性时,您最终会调用 getter 或 setter,您可以查看是否添加了这些方法并包含 println陈述。这样,Java 类可以通过这些方法访问属性,而 Groovy 会假装您正在直接读取或写入字段,但在后台您最终会调用与 Java 相同的方法。

这样做的一个好处是,如果您稍后决定要在设置或获取值时添加一些逻辑,您可以定义相应的方法并添加您想要的内容,而无需更改访问该属性的代码,因为在在 Groovy 中,您仍然可以将其视为一个字段,并且将调用您的自定义方法,并且 Java 类将一直调用 setter 和 getter。
getFields()仅返回公共(public)字段,但 getDeclaredFields()返回所有这些,因此由于实际字段是私有(private)的,这就是 getDeclaredFields() 的原因(或属性访问表单 declaredFields )是必需的。

Grails 不使用注释是因为 Graeme(和其他人)觉得它们丑陋且笨重,而不是因为它们不可访问。

关于grails - 访问 Grails 域类上的字段注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270005/

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