And*_*ega 3 java generics reflection android proguard
我遇到了关于proguard和一些反思的问题.
Myclass.java
package not.obfuscated
class MyClass {
public List<InnerClass> childs;
}
Run Code Online (Sandbox Code Playgroud)
InnerClass.java
package not.obfuscated
class InnerClass {
//.somestuff
}
Run Code Online (Sandbox Code Playgroud)
在proguard.cfg里面我有:
-keep class not.obfuscated.** {*;}
Run Code Online (Sandbox Code Playgroud)
在另一个类中,我设法获取MyClass.childs字段的"Field"实例,然后尝试获取getGenericType以确定列表括号内的哪个类(<InnerClass>)
出于日志记录的目的,我做了以下Log.d代码(字段是表示MyClass.childs的Field实例):
Log.d("FIELD", field.getName()+" generic type: "+ field.getGenericType()+ " class: "+ field.getGenericType().getClass().getName());
Run Code Online (Sandbox Code Playgroud)
输出如下(第2行):

如您所见,field.getGenericType.toString()可能是正确的,但是当我要求该类时,它返回java.lang.Class.事实上,当我这样做时,事后几行:
ParameterizedType listType = (ParameterizedType) field.getGenericType();
Run Code Online (Sandbox Code Playgroud)
我收到一个ClassCastException:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
Run Code Online (Sandbox Code Playgroud)
我坚信这是由于proguard,但据我所知,我已经排除了not.obfuscated包中的所有类.最后一次尝试我也插入了行-keep类java.lang.List(显然没有发生).
And*_*hev 11
默认情况下,Proguard会删除一些类型信息:如何阻止Proguard删除类型参数?
添加以下行应该可以解决问题:
-keepattributes Signature
Run Code Online (Sandbox Code Playgroud)
可能是整个魔术线都可以工作,即:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |