访问 Grails 域上的字段注释 类

Accessing field annotations on Grails domain classes

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

我的注释域 class 看起来像:

class MyDomainClass {
    @MyAnnotation
    String myField
}

通过反射访问 myField 的 Java 方法不起作用:

MyDomainClass.class.getField("myField") //throws java.lang.NoSuchFieldException

检查域 classes 的 Grails 方法不公开字段注释:

new DefaultGrailsDomainClass(MyDomainClass).getPersistentProperty("myField").??? //there is nothing similar to getAnnotations()

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

那不是字段,而是 属性。当您在 Groovy class 中声明一个 class-scope 变量时,没有作用域修饰符(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 classes 可以通过这些方法访问 属性,并且 Groovy 假装你正在直接读取或写入一个字段,但在幕后你最终调用与 Java.

相同的方法

这样做的一个好处是,如果您以后决定要在设置或获取值时添加一些逻辑,您可以定义相应的方法并添加您想要的内容,而无需更改代码访问 属性 因为在 Groovy 中你仍然可以把它当作一个字段,你的自定义方法将被调用,并且 Java classes 将一直调用 setter 和 getter 一直以来。

getFields() returns 仅 public 字段,但 getDeclaredFields() returns 所有字段,因此由于实际字段是私有的,这就是为什么 getDeclaredFields()(或 属性 访问表单 declaredFields)是必需的。

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