When decoding enum annotation value, treat it as a field name, not enum value
Bug: 13078746
(cherry picked from commit cc346026b56ca68149b9f1cbbb42136e09ef0be3)
Change-Id: I647b2121c20072f9872ef010b9ced88874af9fb9
diff --git a/luni/src/main/java/libcore/reflect/AnnotationAccess.java b/luni/src/main/java/libcore/reflect/AnnotationAccess.java
index 064151e..4e34284 100644
--- a/luni/src/main/java/libcore/reflect/AnnotationAccess.java
+++ b/luni/src/main/java/libcore/reflect/AnnotationAccess.java
@@ -708,10 +708,20 @@
} else if (type.isEnum()) {
int fieldIndex = reader.readEnum();
FieldId fieldId = dex.fieldIds().get(fieldIndex);
- String enumName = dex.strings().get(fieldId.getNameIndex());
- @SuppressWarnings({"unchecked", "rawtypes"}) // Class.isEnum is the runtime check
- Class<? extends Enum> enumType = (Class<? extends Enum>) type;
- return Enum.valueOf(enumType, enumName);
+ String fieldName = dex.strings().get(fieldId.getNameIndex());
+ Field field;
+ try {
+ field = type.getDeclaredField(fieldName);
+ return field.get(null);
+ } catch (NoSuchFieldException e) {
+ NoSuchFieldError error = new NoSuchFieldError();
+ error.initCause(e);
+ throw error;
+ } catch (IllegalAccessException e) {
+ IllegalAccessError error = new IllegalAccessError();
+ error.initCause(e);
+ throw error;
+ }
} else if (type.isAnnotation()) {
@SuppressWarnings("unchecked") // Class.isAnnotation is the runtime check
Class<? extends Annotation> annotationClass = (Class<? extends Annotation>) type;