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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

我有第三方罐子(我不能改变使用)java.beans.Introspectorjava.beans.BeanInfojava.beans.PropertyDescriptor

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

它无法Introspector从第三方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;
提问于
用户回答回答于

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

然后,每当第三方JAR中的一个发布修补程序(例如,对于严重的安全错误)时,都要重新执行该操作。

用户回答回答于

很明显,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。这对我来说似乎很脆弱,但看起来像是在工作。

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

扫码关注云+社区