Итак есть аннотация @MyAnno
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
String value();
}
Почему я не могу получить доступ к ее значению через код clazz.getAnnotation(MyAnno.class) с помощью метода value(),где Class clazz = object.getClass();
При работе с полями класса все ок, то есть этот код работает field.getAnnotation(MyAnno.class).value(), где field это элемент массива
Field[] fields = clazz.getDeclaredFields()
P.S clazz.isAnnotationPresent(MyAnno.class) выдает true
Ответ
Предположим, есть такой класс:
@MyAnno("vvv")
public class Anno
{
@MyAnno("xxx")
public final int x = 0;
}
Тестовый код для получения аннотации этого класса:
public static void main(String[] args)
{
Object object = new Anno();
Class clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields)
{
MyAnno myAnno = field.getAnnotation(MyAnno.class);
System.out.println("Field value: " + myAnno.value());
}
MyAnno myAnno = clazz.getAnnotation(MyAnno.class);
System.out.println("Class value: " + myAnno.value());
}
На экран выводится:
Field value: xxx
Class value: vvv
Если использовать
Class clazz = object.getClass();
то придётся явно приводить тип:
MyAnno myAnno = (MyAnno)clazz.getAnnotation(MyAnno.class);
Потому что при использовании raw-type (Class) происходит стирание generic-типов в методах, из-за чего метод getAnnotation начинает возвращать просто Annotation
Комментариев нет:
Отправить комментарий