From 68f99f2440e93b1f80b241ea575929ffa79b9513 Mon Sep 17 00:00:00 2001 From: YOUNG CHA Date: Fri, 22 Mar 2019 17:11:11 +0900 Subject: [PATCH] Make EnumTypeAdapter friendly with obfuscation When enum value was obfuscated by proguard, EnumTypeAdapter raise NoSuchFieldException even if apply SerializedName annotation. Because EnumTypeAdapter cannot find obfuscated enum constant field with its name. --- .../google/gson/internal/bind/TypeAdapters.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index 354ce5a1..f44e056a 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -17,6 +17,7 @@ package com.google.gson.internal.bind; import java.io.IOException; +import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.BigInteger; import java.net.InetAddress; @@ -776,9 +777,14 @@ public final class TypeAdapters { public EnumTypeAdapter(Class classOfT) { try { - for (T constant : classOfT.getEnumConstants()) { + for (Field field : classOfT.getDeclaredFields()) { + if (!field.isEnumConstant()) { + continue; + } + field.setAccessible(true); + T constant = (T)(field.get(null)); String name = constant.name(); - SerializedName annotation = classOfT.getField(name).getAnnotation(SerializedName.class); + SerializedName annotation = field.getAnnotation(SerializedName.class); if (annotation != null) { name = annotation.value(); for (String alternate : annotation.alternate()) { @@ -788,7 +794,11 @@ public final class TypeAdapters { nameToConstant.put(name, constant); constantToName.put(constant, name); } - } catch (NoSuchFieldException e) { + } catch (IllegalAccessException e) { + throw new AssertionError(e); + } catch (NullPointerException e) { + throw new AssertionError(e); + } catch (ExceptionInInitializerError e) { throw new AssertionError(e); } }