如何在 Equinox 中获取捆绑包的类加载器?

Posted

技术标签:

【中文标题】如何在 Equinox 中获取捆绑包的类加载器?【英文标题】:How to get classloader for a bundle in equinox? 【发布时间】:2010-12-02 23:07:38 【问题描述】:

我已经为此阅读了很多 Equinox 代码,但仍然无法找到一种在 eclipse Equinox 设置中获取 osgi 包的类加载器的简单方法。有吗?

【问题讨论】:

【参考方案1】:

简短的回答(当然对于 OSGi 4.1,不确定 4.2)是您无法获得捆绑包的类加载器。然而Bundle 接口公开了一个@987654321@ 方法,这将允许您编写一个类加载器来包装捆绑API 并委托给该loadClass() 方法。或者您可以节省一些时间并改用 Spring DM 的 @987654322@ 类。

【讨论】:

【参考方案2】:

在普通的java代码中,你可以得到加载给定对象的类加载器

object.getClass().getClassLoader();

甚至只是

SomeType.class.getClassLoader();

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

【讨论】:

但是你有一个引导问题。您如何获得第一个实例? 如果你依赖于另一个包,你可以直接引用另一个类(SomeType.class)osgi类加载器在包之间委托,所以它仍然来自另一个类加载器。如果您没有依赖项,则需要获取 Bundle 对象(使用 PackageAdmin)并使用另一个答案中提到的 Bundle#loadClass。 J2SE 类加载不适合 J2EE。 ***.com/questions/34787419/… 这不是正确的类加载器。用于加载 Bundle 类的类加载器通常与充当类加载器的捆绑包不同。更一般地说,ClassLoader.class 的类加载器通常与任何给定的类加载器实例不同。虽然在简单的环境中,它们可能是相同的,但在分区环境(OSGi、JavaEE)中它们会有所不同。【参考方案3】:

在 OSGi 4.3 中,您可以使用:

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

【讨论】:

【参考方案4】:

bundle的类加载器可以通过BundleWiring接口获取。这是一个简短的例子:

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

【讨论】:

以上是关于如何在 Equinox 中获取捆绑包的类加载器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Equinox 3.10 及更高版本中获取所有已加载的包

在 OSGi 环境中,类路径和类加载器是如何设置的?

如何设置捆绑开发环境(Eclipse Equinox Maven)

在 OSGi 中更好地处理线程上下文类加载器

面试常问的类加载器与双亲委派模型

自定义包的类不会使用composer autoloader自动加载