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

标签 grails groovy

我正在尝试在我的域类上注释字段,但我无法像通常的 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/

相关文章:

java - Groovy:向 URL 发送请求,忽略结果

groovy - 检查 List 在 Groovy 中是否有空字符串

grails-2.3.0.M1无法在IntelliJ IDEA 130.754中启动

mysql - grails 域默认按上次更新字段排序

grails - 将 grails 从 2.1.1 升级到 2.4.3

java - 无法在Eclipse中执行Gradle构建

Groovy Grape 处理依赖解析

validation - Grails 重复错误消息

json - 使JSON中的allError失效

groovy - 如何引用外部类this?