使用使用java.beans类的jar(Introspector,BeanInfo或PropertyDescriptor)

时间:2013-02-25 11:07:02

标签: java android reflection

我有使用java.beans.Introspectorjava.beans.BeanInfojava.beans.PropertyDescriptor的第三方jar(我无法更改)。

如何在我的Android应用程序中使用该jar?

无法从第3方jar加载类(使用Introspector):

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;

2 个答案:

答案 0 :(得分:14)

很明显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并且您可以重新实现此类的一部分。

还在我看到this的主题上搜索了一下。他们只是使用java.beans包并为android编译它。这对我来说似乎很脆弱,但看起来它正在发挥作用。

不幸的是,这不是一个解决方案,只是我想分享的想法。希望你找到那些有用的。

答案 1 :(得分:9)

唯一的解决方案是维护噩梦:从源头分叉所有第3个聚会罐并重写它们以便他们不使用java.beans。*类(可能将它们替换为openbeans)

然后,每当第三方派对中的一个发布修补程序时(例如针对关键安全性错误),请重新执行