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;