我有使用java.beans.Introspector
、java.beans.BeanInfo
和java.beans.PropertyDescriptor
的第三方jar (我不能更改)。
如何在我的安卓应用程序中使用该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;
发布于 2013-03-05 22:38:34
唯一的解决方案是维护噩梦:openbeans从源代码派生所有第三方jars并重写它们,这样它们就不会使用java.bean.*类(可能是通过将它们替换为openbeans)。
然后,每当这些第三方jars中的一个发布热修复程序(例如,针对关键的安全错误)时,再重新执行一次。
发布于 2013-03-03 19:15:44
很明显,java.beans包在android上并不完整。常见的解决方案是重新打包依赖于它们的java.beans和jar,以使用不同的包名而不是java.beans。这正是前面提到的openbeans所做的事情。一个有趣的问题来自android的错误消息: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是不能更改还是不允许更改(您提到了两者)。我不知道更改jars的法律含义,但从技术上讲,总是有可能的,例如,尝试反向工程类,用aspectj之类的东西做一些构建时插装。如果这是不允许的,我认为运行时插装是可以完成的,例如,dexmaker可以为使用java.beans的第三方类创建代理,您可以重新实现该类的一部分。
我也在谷歌上搜索了一下这个话题,我看到了this。他们只是使用java.beans包,并为安卓编译它。这对我来说似乎很脆弱,但看起来像是在工作。
不幸的是,这不是一个解决方案,只是我想分享的想法。希望你能发现这些有用的东西。
https://stackoverflow.com/questions/15065545
复制相似问题