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

200
21 февраля 2017, 16:53

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

Answer 1

Предположим, есть такой класс:

@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.

READ ALSO
Чёрные полосы вместо ресурсов (libGDX)

Чёрные полосы вместо ресурсов (libGDX)

Все ресурсы, которые я получаю из этого Skin через метод getDrawable, отображаются как чёрные прямоугольникиКогда я беру незапакованный ресурс,...

214
Загрузка файла через Spring

Загрузка файла через Spring

У меня есть dev серевер на котором крутится angular 2 по адрусу localhost:4200, и tomcat со Spring на localhost:8080Пробую загрузить файл на сервер следующим способом:...

532
Обрыв wifi Android в проекте с поиском BLE-маяков

Обрыв wifi Android в проекте с поиском BLE-маяков

На проекте есть три экрана: первый - для загрузки данных, используется AsyncTaskВторая получает данные с первой

219
Рестарт приложения

Рестарт приложения

Как возможно до начала своих тестов сделать рестарт приложения или же убить свою активность? Потому как если этого не делать, то данные который...

225