我编写了一个库,在其中我对Java字段进行了一些内省以获得它们的注释列表(更具体地说是看它们是否有一个或多个特定的注释(比如 - @Id
,{{ 1}},@Child
)。这是我使用的代码类型的示例:
@Parent
其中 @Override
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
return mapped.getAnnotation(annotationClass);
}
是Java Field(因此有getAnnotation(Annotation)
方法)。我想将此方法移植到Groovy。
我已经理解使用Groovy,我必须用MetaProperties替换我的Fields(或bean属性)。但是,考虑到使用这些注释,我遇到了一个问题,因为看起来groovy处理它们的方式与Java完全不同。
那么,是否可以考虑从Java注释到Groovy AnnotationNode的迁移路径,还是我必须创建这些概念的抽象?
答案 0 :(得分:0)
我不确定AnnotationNode。基于它的包,我认为它与AST Transformations有关。
在任何情况下,您的代码应该在Groovy中与Java一样工作。我在Groovy中使用JPA并通过Java反射访问了注释。如果您遇到特定问题,请提供更多详细信息。
你似乎对“fields”与“metaProperties”感到困惑。您不会将字段更改为metaProperties。您的字段将成为metaProperties。换句话说,默认情况下,Groovy类上的字段是bean属性(您可以免费获得getter / setter)。您可以使用Groovy动态访问属性,但它们仍然是字节码中的Field。
下面是一个小的Groovy脚本,演示了访问bean属性并获取它的注释。
import java.lang.reflect.*
class Person {
@Deprecated
String name
}
def me = new Person(name:'dave')
assert me.name == 'dave'
assert me.'name' == 'dave'
assert me.getName() == 'dave'
assert Person.class.getDeclaredField('name') instanceof Field
assert Person.class.getDeclaredField('name').getAnnotations()
assert Person.class.getDeclaredField('name').getAnnotation(Deprecated.class)