Как использовать политику аренды аннотаций Java для CLASS - PullRequest
3 голосов
/ 04 июня 2010

Я использую аннотации для создания документации для API, который я публикую. Я определил это так:

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

    String description();

    String since() default "5.8";

    String link() default "";
}

Теперь это работает нормально, когда я обрабатываю классы, используя отражение. Я могу получить список аннотаций по методу. У меня проблема в том, что это работает, только если я создаю новый экземпляр объекта, который я обрабатываю. Я бы предпочел не создавать их экземпляры, чтобы получить аннотацию. Я пробовал RetentionPolicy.CLASS, но он не работает.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 04 июня 2010

Вам не нужно создавать экземпляр объекта, вам просто нужен класс. Вот пример:

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());
      }
    }
  }
}
2 голосов
/ 04 июня 2010

Вы можете получить аннотации для класса, используя интроспекцию бина:

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());
    }

}
2 голосов
/ 04 июня 2010

Начиная с Java5, классы загружаются лениво.

Существуют некоторые правила, которые определяют, должен ли класс быть загружен. Первое активное использование класса происходит, когда происходит одно из следующих действий:

  • Экземпляр этого класса создан
  • Инициализирован экземпляр одного из его подклассов
  • Инициализировано одно из его статических полей.

Так что, в вашем случае, простой ссылки на его имя для целей отражения недостаточно для запуска его загрузки, и вы не можете видеть аннотации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...