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

2022-09-02 12:47:52

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

如何在我的安卓应用程序中使用该罐子?

它无法从第三方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;

答案 1

很明显,java.beans软件包在android上并不完整。常见的解决方案是重新打包java.beans和依赖于它们的jar,以使用不同的包名称而不是java.beans。这正是前面提到的openbean所做的。来自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.

为了避免这条路,我将首先研究实际使用openbean的选项,并尝试强制第三方使用这些选项。从你写的内容来看,不清楚jar是否可以更改或不允许更改(您提到了两者)。我不知道更改jar的法律含义,但从技术上讲,它总是可能的,例如尝试逆向工程类,使用aspectj之类的东西做一些构建时的检测。如果不允许这样做,我认为可以完成运行时检测,例如dexmaker可以为您的第三方类创建代理,该类使用java.bean,您可以重新实现该类的一部分。

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

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


答案 2

唯一的解决方案是维护噩梦:从源代码中分叉所有第三方jar并重写它们,以便它们不使用java.beans.*类(可能通过将它们替换为openbeans)。

然后,每当其中一个第三方jar发布修补程序(例如,对于关键安全错误)时,请再次执行此操作。


推荐