Field.getGenericType() возвращает экземпляр java.lang.Class вместо Type
У меня проблемы с Proguard и некоторыми вещами для размышлений.
Myclass.java
package not.obfuscated
class MyClass {
public List<InnerClass> childs;
}
InnerClass.java
package not.obfuscated
class InnerClass {
//.somestuff
}
Внутри proguard.cfg у меня есть:
-keep class not.obfuscated.** {*;}
Внутри другого класса мне удается получить экземпляр "Field" для поля MyClass.childs, а затем попытаться получить getGenericType, чтобы определить, какой класс находится в скобках списка (
Для целей ведения журнала я сделал следующий код Log.d (поле является экземпляром поля, представляющего MyClass.childs):
Log.d("FIELD", field.getName()+" generic type: "+ field.getGenericType()+ " class: "+ field.getGenericType().getClass().getName());
Вывод следующий (2-я строка):
Как вы видите, field.getGenericType.toString () может быть правильным, но когда я запрашиваю класс, он возвращает java.lang.Class. Действительно, пару строк потом, когда я это сделаю:
ParameterizedType listType = (ParameterizedType) field.getGenericType();
Я получаю ClassCastException:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
Я твердо верю, что это связано с proguard, но насколько я знаю о proguard, я уже исключил все классы из пакета not.obfuscated. В качестве последней попытки я также вставил строку -keep класса java.lang.List (очевидно, ничего не произошло).
1 ответ
По умолчанию Proguard удаляет некоторую информацию о типах: как вы не позволяете Proguard удалять параметры типа?
Добавление следующей строки должно решить проблему:
-keepattributes Signature
Может быть, вся магическая линия будет работать, а именно:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod