我正在尝试在我的域类上注释字段,但我无法像通常的 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 类中声明一个没有范围修饰符( public
、 protected
等)的类范围变量时,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/