Geo*_*met 18 java reflection android
我有第三方jar(我无法改变)使用java.beans.Introspector,java.beans.BeanInfo和java.beans.PropertyDescriptor.
如何在我的Android应用程序中使用该jar?
它无法Introspector从第3方jar 加载类(使用):
WARN/dalvikvm(780): VFY: unable to resolve static method 6325: Ljava/beans/Introspector;.getBeanInfo (Ljava/lang/Class;)Ljava/beans/BeanInfo;
WARN/dalvikvm(780): VFY: unable to resolve exception class 962 (Ljava/beans/IntrospectionException;)
WARN/dalvikvm(780): Verifier rejected class Lorg/thirdpartyjar/SomeClass;
Run Code Online (Sandbox Code Playgroud)
efa*_*fan 15
很明显java.beans包在android上并不完整.常见的解决方案是重新打包java.beans和依赖于它们的jar来使用不同的包名而不是java.beans.这正是之前提到的openbeans所做的.并且来自android错误消息的一个有趣的qoute状态:If you find that you cannot do this, then that is an indication that the path you are on will ultimately lead to pain, suffering, grief, and lamentation.
为了避免这条路,我将首先研究实际使用openbeans的选项,并试图强迫第三方使用它们.根据你的写作,不清楚jar是不是可以改变或不允许改变(你提到两者).我不知道更换罐子的法律含义,但从技术上讲,它总是可行的,例如尝试逆向工程类,用一些像aspectj这样的构建时间仪器.如果不允许这样做,我认为可以完成运行时检测,例如dexmaker可以为您的第三方类创建代理,这是使用java.beans并且您可以重新实现此类的一部分.
此外谷歌搜索上我看到的题目有点这个.他们只是使用java.beans包并为android编译它.这对我来说似乎很脆弱,但看起来它正在发挥作用.
不幸的是,这不是一个解决方案,只是我想分享的想法.希望你找到那些有用的.
Geo*_*met 10
唯一的解决方案是维护噩梦:从源代码中分叉所有第3方jar并重写它们,这样它们就不会使用java.beans.*类(可能将它们替换为openbeans).
然后,每当第3个聚会罐中的一个发布修补程序(例如关键安全错误)时,请重新执行此操作.
| 归档时间: |
|
| 查看次数: |
8026 次 |
| 最近记录: |