如何使用CLASS的Java注释保留策略

时间:2010-06-04 14:55:49

标签: java annotations

我正在使用注释为我正在发布的API生成文档。我把它定义如下:

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PropertyInfo {

    String description();

    String since() default "5.8";

    String link() default "";
}

现在,当我使用反射处理类时,这可以正常工作。我可以获得该方法的注释列表。我遇到的问题是它只有在我实例化我正在处理的对象的新实例时才有效。我宁愿不必实例化它们来获取注释。我尝试了RetentionPolicy.CLASS,但它不起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您不需要实例化对象,只需要该类。这是一个例子:

public class Snippet {

  @PropertyInfo(description = "test")
  public void testMethod() {
  }
  public static void main(String[] args)  {
    for (Method m : Snippet.class.getMethods()) {
      if (m.isAnnotationPresent(PropertyInfo.class)) {
        System.out.println("The method "+m.getName()+
        " has an annotation " + m.getAnnotation(PropertyInfo.class).description());
      }
    }
  }
}

答案 1 :(得分:2)

从Java5开始,类是懒惰加载的。

有一些规则决定是否应该加载一个类。 当出现以下情况之一时,会发生类的第一次活动使用:

  • 创建该类的实例
  • 其子类之一的实例已初始化
  • 其中一个静态字段已初始化

因此,在您的情况下,仅仅为了反射而引用其名称不足以触发其加载,并且您无法看到注释。

答案 2 :(得分:2)

您可以使用bean introspection获取类的注释:

Class<?> mappedClass;
BeanInfo info = Introspector.getBeanInfo(mappedClass);
PropertyDescriptor[] descriptors = info.getPropertyDescriptors();

for (PropertyDescriptor descriptor : descriptors) {
    Method readMethod = descriptor.getReadMethod();
    PropertyInfo annotation = readMethod.getAnnotation(PropertyInfo.class);
    if (annotation != null) {
        System.out.println(annotation.description());
    }

}