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-я строка):

Выход LogCat

Как вы видите, 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 
Другие вопросы по тегам