1

我正在将我的应用程序升级到最新版本的 Eclipse Equinox 3.7 和相关库。我很高兴在 OSGi 4.3 中获得通用支持并挖掘新的 Bundle.adapt() 概念。我遇到了一个绊脚石。

以前,我使用 PackageAdmin.getBundle(Class) 来找出哪个包加载了哪些类。由于一些 RMI 对象序列化使用,我必须这样做。

问题:有没有办法使用新的 BundleWiring API 来完成相同的结果,将 Class 映射到 Bundle?

我意识到 PackageAdmin 可能不会很快消失,但我讨厌弃用警告。

4

1 回答 1

3

有点尴尬,我第一次浏览文档时没有找到这个。为了完整起见,回答我自己的问题。

从核心规范 PDF ...

第 3.9.9 节 - 查找对象的包

在某些情况下,无法访问捆绑上下文的代码中需要捆绑。为此,该框架提供了以下方法:

Framework Util – 通过带有 getBundle(Class) 方法的 FrameworkUtil 类。框架提供此方法以允许代码在没有获取类加载器权限的情况下查找对象的捆绑包。当类不是源自包时,该方法返回 null。

类加载器——OSGi 框架必须确保来自包的类的类加载器实现 BundleReference 接口。这允许遗留代码通过获取其类加载器并将其强制转换为 BundleReference 对象来查找对象的包,该对象提供对 Bundle 的访问。但是,这需要代码具有访问类加载器的权限。下面的代码片段展示了如何从任何对象中获取一个 Bundle 对象。

ClassLoader cl = target.getClassLoader();
if ( cl instanceof BundleReference ) {
BundleReference ref = (BundleReference) cl;
Bundle b = ref.getBundle();
...
}

在 OSGi 系统中,并非所有对象都属于该框架。因此,有可能获得一个没有实现 BundleReference 接口的类加载器,例如引导类路径加载器。

于 2011-07-07T17:42:55.133 回答