访问 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 变量时,没有作用域修饰符(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 classes 可以通过这些方法访问 属性,并且 Groovy 假装你正在直接读取或写入一个字段,但在幕后你最终调用与 Java.
相同的方法
这样做的一个好处是,如果您以后决定要在设置或获取值时添加一些逻辑,您可以定义相应的方法并添加您想要的内容,而无需更改代码访问 属性 因为在 Groovy 中你仍然可以把它当作一个字段,你的自定义方法将被调用,并且 Java classes 将一直调用 setter 和 getter 一直以来。
getFields()
returns 仅 public 字段,但 getDeclaredFields()
returns 所有字段,因此由于实际字段是私有的,这就是为什么 getDeclaredFields()
(或 属性 访问表单 declaredFields
)是必需的。
Grails 不使用注解是因为 Graeme(和其他人)觉得它们又丑又笨重,而不是因为它们不可访问。
我正在尝试在我的域 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 变量时,没有作用域修饰符(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 classes 可以通过这些方法访问 属性,并且 Groovy 假装你正在直接读取或写入一个字段,但在幕后你最终调用与 Java.
这样做的一个好处是,如果您以后决定要在设置或获取值时添加一些逻辑,您可以定义相应的方法并添加您想要的内容,而无需更改代码访问 属性 因为在 Groovy 中你仍然可以把它当作一个字段,你的自定义方法将被调用,并且 Java classes 将一直调用 setter 和 getter 一直以来。
getFields()
returns 仅 public 字段,但 getDeclaredFields()
returns 所有字段,因此由于实际字段是私有的,这就是为什么 getDeclaredFields()
(或 属性 访问表单 declaredFields
)是必需的。
Grails 不使用注解是因为 Graeme(和其他人)觉得它们又丑又笨重,而不是因为它们不可访问。