如何在Equinox中获取一个Bundle的类加载器?

18

我已阅读大量关于此问题的Equinox代码,但仍然找不到在Eclipse Equinox设置中获取OSGi bundle的类加载器的非hacky方法。是否有这样一种方法?

4个回答

40

在 OSGi 4.3 中,您可以使用:

bundle.adapt(BundleWiring.class).getClassLoader()

11
短期内(至少针对OSGi 4.1,不确定4.2是否适用),您无法获得束的类加载器。但是,Bundle接口公开了loadClass()方法,您可以编写一个包装束API并委托给该loadClass()方法的类加载器。或者,您可以节省一些时间,改用Spring DM的BundleDelegatingClassLoader类。

6

通过BundleWiring接口可以获得Bundle的类加载器。以下是一个简短的示例:

Bundle bundle = bundleContext.getBundle();
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
ClassLoader classLoader = bundleWiring.getClassLoader();

2

在普通的Java代码中,您可以使用以下代码获取加载给定对象的类加载器:

object.getClass().getClassLoader();

甚至只需要这样。
SomeType.class.getClassLoader();

同样适用于Equinox,只需使用来自您感兴趣的bundle的对象或类型即可。

1
但是你会遇到一个引导问题。你如何获得第一个实例? - Geniedesalpages
如果您依赖于其他捆绑包,可以直接引用其他类(SomeType.class),OSGi类加载器在捆绑包之间进行委派,因此它仍然来自其他类加载器。如果您没有依赖关系,则需要获取Bundle对象(使用PackageAdmin)并使用Bundle#loadClass,如其他答案中所述。 - Andrew Niefer
J2SE类加载不适用于J2EE。https://dev59.com/lpPea4cB1Zd3GeqP9gOc - Poornan
这不是正确的类加载器。用于加载Bundle类的类加载器通常与充当类加载器的bundle不同。更一般地说,ClassLoader.class的类加载器通常与任何给定的类加载器实例不同。虽然在简单环境中,它们可能会变得相同,但在分区环境(OSGi,JavaEE)中它们将不同。 - Thomas Bitonti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接