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, чтобы определить, какой класс находится в скобках списка (‹InnerClass>)

Для ведения журнала я сделал следующий код Log.d (field - это экземпляр Field, представляющий 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 class java.lang.List (очевидно, что ничего не произошло).


person Andrea Baccega    schedule 19.11.2013    source источник


Ответы (1)


По умолчанию Proguard удаляет часть информации о типе: Как остановить Proguard от удаления параметров типа?

Добавление следующей строки должно решить проблему:

-keepattributes Signature

Может быть, сработает вся волшебная линия, а именно:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 
person Andrey Chaschev    schedule 19.11.2013
comment
-keepattributes Аннотация -keepattributes Подпись - person Andrea Baccega; 19.11.2013
comment
Здравствуйте, я добавил вверху моего proguard, но это не работает -keepattributes Signature Я должен упомянуть, что у меня есть еще -keepattributes Attributes до этого. - person Andrea Baccega; 19.11.2013
comment
Эй, может быть, это обрезает информацию о внутренних классах - я обновил полную строку - надеюсь, это поможет. - person Andrey Chaschev; 19.11.2013
comment
Привет, @Andrey, gradle не перекомпилировал исходный код с использованием нового файла proguard. Решение (первая предложенная вами строка) работает отлично :) Спасибо - person Andrea Baccega; 19.11.2013
comment
@AndreyChaschev ты спас мне жизнь :). Большое тебе спасибо. - person maddy d; 17.07.2015
comment
Исправлен мой проект модернизации и rxjava. Ваше здоровье - person Tom; 01.09.2015