【问题标题】:Using jars that use java.beans classes (Introspector, BeanInfo or PropertyDescriptor)使用使用 java.beans 类(Introspector、BeanInfo 或 PropertyDescriptor)的 jar
【发布时间】:2013-02-10 12:18:07
【问题描述】:

我有使用 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;

【问题讨论】:

标签: java android reflection


【解决方案1】:

很明显 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 的选项并尝试强制第 3 方使用这些选项。从您所写的内容来看,尚不清楚 jar 是不能更改还是不允许更改(您提到两者)。我不知道更换罐子的法律含义,但从技术上讲,它总是可能的,例如尝试逆向工程课程,使用 aspectj 之类的东西做一些构建时间检测。如果不允许这样做,我认为可以进行运行时检测,例如dexmaker 可以为您使用 java.beans 的第三方类创建代理,您可以重新实现该类的一部分。

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

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

【讨论】:

  • 有趣的想法顺便说一句。 Android 的官方消息确实是短视的,因为他们基本上禁止使用 JSR 标准化的 java 库(如 JAXB、JAXRS、JPA、DI、...)。所以基本上导入 javax.inject (由 google guice 使用)也不起作用?
  • 谢谢。好吧,guice 也使用 com.google.inject。但我认为你可能是对的,因为谷歌搜索显示人们只是使用 --core-library 选项忽略错误消息中的警告,例如之前提到过javax.inject
  • 嗯,也许“给 dx --core-library 标志”确实是整个问题的解决方法。有趣:)
【解决方案2】:

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

然后,每次这些第 3 方 jar 中的一个发布修补程序(例如针对严重的安全漏洞)时,重新进行一次

【讨论】:

  • this issue 如果你想让安卓修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多