Если вы используете обфускатор, такой как 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) {
//
}
}
}