Field.getGenericType()返回java.lang.Class的实例而不是Type

时间:2013-11-19 13:23:04

标签: java android generics reflection proguard

我遇到了关于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.** {*;}

在另一个类中,我设法获取MyClass.childs字段的“Field”实例,然后尝试获取getGenericType以确定列表括号内的哪个类(&lt; InnerClass&gt;)

出于日志记录的目的,我做了以下Log.d代码( field 是代表MyClass.childs的Field实例):

Log.d("FIELD", field.getName()+" generic type: "+ field.getGenericType()+ " class: "+ field.getGenericType().getClass().getName());

输出如下(第2行):

LogCat output

如您所见,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,但据我所知,我已经排除了not.obfuscated包中的所有类。最后一次尝试我也插入了行-keep类java.lang.List(显然没有发生任何事情)。

1 个答案:

答案 0 :(得分:11)

默认情况下,Proguard会删除部分类型信息:How do you stop Proguard from removing type parameters?

添加以下行应该可以解决问题:

-keepattributes Signature

可能整个魔术线都可以工作,即:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod