Страницы

Поиск по вопросам

пятница, 14 июня 2019 г.

Не могу получить значение аннотации у класса

Итак есть аннотация @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

Комментариев нет:

Отправить комментарий