Groovy的AnnotationNode和Java的注释有什么区别?

时间:2010-10-19 08:22:53

标签: java groovy annotations

我编写了一个库,在其中我对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的迁移路径,还是我必须创建这些概念的抽象?

1 个答案:

答案 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)