如何使用BundleWiring查找Bundle / Class关系(之前通过PackageAdmin完成)?

时间:2011-07-07 17:03:32

标签: osgi equinox

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

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

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

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

1 个答案:

答案 0 :(得分:3)

有点尴尬,我第一次浏览文件时没有发现这个。回答我自己的问题是否完整。

从核心规范PDF ...

第3.9.9节 - 查找对象的包

在某些情况下,无法访问Bundle Context的代码中需要捆绑包。为了这 原因,框架提供了以下方法:

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

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

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

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