Получить аннотации для переменной типа enum - PullRequest
34 голосов
/ 31 августа 2011

У меня есть не переменная null (например, en1) типа Enum. Вопрос: как получить аннотации, относящиеся к константе перечисления, на которую ссылается переменная en1?

Ответы [ 5 ]

34 голосов
/ 31 августа 2011

Попробуйте это (отражение Java):

String field = En.AAA.name();
En.class.getField(field).getAnnotations();

Он должен получить аннотации от AAA.

EDIT:

Как предположил автор:

en1.getClass().getField(((Enum)en1).name()).getAnnotations(); 

Работает на него:)

21 голосов
/ 31 августа 2011

Как я уже предлагал:

en1.getClass().getField(((Enum)en1).name()).getAnnotations();

Для ясности:

String name = e.name(); // Enum method to get name of presented enum constant
Annotation[] annos = e.getClass().getField(name).getAnnotations(); // Classical reflection technique

В этом случае нам не нужно знать реальный класс en1.

См. Также: Замечание о запутанном случае .

7 голосов
/ 31 августа 2011

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Anno1 {
   // ...
}

Без этого они не будут доступны во время выполнения.

Дополнительная литература:

4 голосов
/ 02 сентября 2016

Если вы используете обфускатор, такой как Proguard, вы можете обнаружить, что поля enum были переименованы, в то время как .name() все еще возвращает исходное имя поля. Например, это перечисление ...

enum En {
    FOO,
    BAR
}

... станет таким после ProGuarding ...

enum En {
    a,
    b
}

... но En.FOO.name() будет по-прежнему возвращать "FOO", что приведет к сбою getField(En.FOO.name()), так как ожидается, что поле будет названо "a".

Если вы хотите получить Field для определенного поля перечисления из запутанного кода, вы можете сделать это:

for (Field field : En.class.getDeclaredFields()) {
    if (field.isEnumConstant()) {
        try {
            if (en1 == field.get(null)) {
                Annotation[] annotations = field.getAnnotations();
            }
        } catch (IllegalAccessException e) {
            // 
        }
    }
}
2 голосов
/ 27 августа 2016

В дополнение к существующим ответам, если вы управляете классом enum (можете его редактировать), вы можете просто добавить метод в enum для получения необходимой аннотации, то есть

AnnotationClass getAnnotation(){
   Field field = this.getClass().getField(this.name());
   return field.getAnnotation(AnnotationClass.class);       
}

или всехэто аннотации:

Annotation[] getAnnotations(){
   Field field = this.getClass().getField(this.name());
   return field.getAnnotations();
}

Настройте приведенный выше код для обработки исключений (NoSuchFieldException и SecurityException).

...