我试图在我的域类上注释字段,但是我不能像通常的Java字段那样在运行时获取它们。
我的带注释的域类看起来像:
class MyDomainClass {
@MyAnnotation
String myField
}
通过反射访问myField
的Java方式不起作用:
MyDomainClass.class.getField("myField") //throws java.lang.NoSuchFieldException
Grails检查域类的方法没有公开字段注释:
new DefaultGrailsDomainClass(MyDomainClass).getPersistentProperty("myField").??? //there is nothing similar to getAnnotations()
如何检索与域字段关联的注释?
答案 0 :(得分:1)
那不是一个领域,它是一个属性。当您在Groovy类中声明类似范围的变量(没有范围修饰符(public
,protected
等))时,Groovy编译器会将其转换为具有相同类型和名称的私有字段,以及一个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()
仅返回公开字段,但getDeclaredFields()
会返回所有字段,因为实际字段是私有的,这就是为什么getDeclaredFields()
(或属性访问形式{{ 1}})是必要的。
Grails没有使用注释,因为Graeme(和其他人)认为他们丑陋而且体积庞大,并不是因为他们无法访问。