访问Grails域类的字段注释

时间:2015-03-26 02:18:57

标签: grails groovy

我试图在我的域类上注释字段,但是我不能像通常的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()

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

1 个答案:

答案 0 :(得分:1)

那不是一个领域,它是一个属性。当您在Groovy类中声明类似范围的变量(没有范围修饰符(publicprotected等))时,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(和其他人)认为他们丑陋而且体积庞大,并不是因为他们无法访问。