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

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

概述我遇到了关于proguard和一些反思的问题.Myclass.javapackagenot.obfuscatedclassMyClass{publicList<InnerClass>childs;}InnerClass.javapackagenot.obfuscatedclassInnerClass{//.somestuff}在proguard.cfg里面我有:-keepclassnot.obfuscated.

我遇到了关于proguard和一些反思的问题.

Myclass.java

package not.obfuscatedclass MyClass {    public List<InnerClass> childs;}

InnerClass.java

package not.obfuscatedclass InnerClass {    //.somestuff}

在proguard.cfg里面我有:

-keep class not.obfuscated.** {*;}

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

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

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

解决方法:

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

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

-keepattributes Signature

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

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,Sourcefile,lineNumbertable,*Annotation*,EnclosingMethod 
总结

以上是内存溢出为你收集整理的Field.getGenericType()返回java.lang.Class的实例而不是Type全部内容,希望文章能够帮你解决Field.getGenericType()返回java.lang.Class的实例而不是Type所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:http://outofmemory.cn/web/1116401.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存