Ответ 1
Вопреки ожиданиям, элементы аннотации не являются атрибутами - на самом деле это методы, которые возвращают предоставленное значение или значение по умолчанию.
Вы должны перебирать методы аннотаций и вызывать их, чтобы получить значения. Используйте annotationType()
, чтобы получить класс аннотаций, объект, возвращаемый getClass()
, является просто прокси.
Вот пример, который печатает все элементы и их значения аннотации @Resource
класса:
@Resource(name = "foo", description = "bar")
public class Test {
public static void main(String[] args) throws Exception {
for (Annotation annotation : Test.class.getAnnotations()) {
Class<? extends Annotation> type = annotation.annotationType();
System.out.println("Values of " + type.getName());
for (Method method : type.getDeclaredMethods()) {
Object value = method.invoke(annotation, (Object[])null);
System.out.println(" " + method.getName() + ": " + value);
}
}
}
}
Выход:
Values of javax.annotation.Resource
name: foo
type: class java.lang.Object
lookup:
description: bar
authenticationType: CONTAINER
mappedName:
shareable: true
Спасибо Аарону за указание на то, что вам нужно привести аргумент null
, чтобы избежать предупреждений.