我有使用java.beans.Introspector
、java.beans.BeanInfo
和java.beans.PropertyDescriptor
的第三方jar(我无法更改(。
如何在我的android应用程序中使用该jar
从第三方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;
很明显,java.beans包在android上并不完整。常见的解决方案是重新打包java.beans和依赖于它们的jar,以使用不同的包名,而不是java.beans。这正是前面提到的openbeans所做的。来自android的一条有趣的qute错误消息指出: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是不能更改还是不允许更改(你提到了两者(。我不知道更改jar的法律含义,但从技术上讲,这总是可能的,例如,尝试反向工程类,用aspectj之类的东西进行一些构建时检测。如果不允许这样做,我认为可以进行运行时插入,例如,dexmaker可以为您的第三方类创建代理,该类使用java.beans,您可以重新实现该类的一部分。
我也在谷歌上搜索了一下这个话题。他们只是使用java.beans包并为android编译它。这对我来说似乎很脆弱,但看起来很有效。
不幸的是,这不是一个解决方案,只是我想分享的想法。希望你觉得这些有用。
唯一的解决方案是维护噩梦:从源代码中派生所有第三方jar并重写它们,这样它们就不会使用java.beans.*classes(可能是用openbeans替换它们(。
然后,每当第三方jar中的一个发布修补程序(例如,针对关键的安全漏洞(时,请重新执行。