3

我尝试运行一个明显使用 sun.reflect 包的包。

首先是更多背景信息:我在Android上使用Apache Felix。我还添加了 sun.reflect 作为系统额外包。

String extrapackets =  "sun.reflect; version=\"1.0.0\"";

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, extrapackets);

config.put("felix.bootdelegation.implicit", "false");

“sun.reflect”也显示在系统包的导出列表中(使用 headers cmd)。它是由我的捆绑包导入的。它还在导出和导入内容时获得了正确的版本号。

错误消息:

java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:76)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:30)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
...
4

3 回答 3

1

如果其他人遇到此问题,可能会有更快的解决方案。

在 Sun/Oracle JVM 上运行的 OSGi 中使用反射时,我遇到了这个错误。事实证明这是一个已知问题。在 JVM 级别设置的建议修复-Dsun.reflect.noInflation=true将导致类不被引用,代价是忽略优化。

我尝试了修复,它对我有用。

于 2014-01-20T06:15:25.337 回答
0

据我所知,sun.* 包是您在计算机上安装的 Oracle JVM 中使用的内部包。另一方面,Android 不使用 Sun(现在是 Oracle)的 JVM 实现。Android 提供了一个类似于 Java SE 的 API,但有自己的 VM 实现(称为 Dalvik VM)。

所以,你不会在 Android 上找到 sun.* 包。您需要获取您使用的包的源代码,并针对 Android 库进行编译(使用 Eclipse 中的 Android 项目,或使用 Ant)。然后,将其重新打包到一个 jar 中,然后您可以在不引用 sun.* 包的情况下部署它。

卡提克

于 2012-07-14T10:34:33.843 回答
0

您是否还在捆绑包中导入了包?仅仅将它添加到您的 systembundles.extra 是不够的。

于 2012-07-14T12:58:30.620 回答