有没有办法让一个bundle从ServiceReference获取另一个bundle的Bundle实例?

时间:2011-01-13 15:11:12

标签: osgi

我正在尝试创建一个监视服务注册的捆绑包,并根据服务接口的API捆绑中嵌入的某些元数据执行一些其他任务。元数据主要由一个或多个属性文件组成,所以我的想法是使用Bundle.findEntries(),但由于元数据嵌入在API包中,我不能像ServiceReference.getBundle().findEntries()这样做,因为这会尝试查找服务实现包中的属性,而不是在API包中。

我考虑过从ServiceReference ObjectClass属性获取服务API类名,然后使用Package Admin服务或FrameworkUtil.getBundle(),但这两者都需要Class - 但是如何获得服务接口的Class?正在执行此工作的软件包可能尚未导入Class的软件包,因此Class.forName()将无效。

我的另一个选择是监视捆绑和服务事件:第一个创建包含元数据的包的注册表,第二个使用注册服务时的第一个。在走这条路之前,我正在寻找一种更简单的方法。

1 个答案:

答案 0 :(得分:4)

免责声明:我没有尝试过,但我有理由相信它应该可以胜任。

您可以从ServiceReference的{​​{1}}获取包名,所以现在我们可以在框架中找到包。给定ObjectClass,您可以执行类似

的操作
PackageAdmin packageAdmin

我们在这里做的是找到具有给定包名的所有包(可能有多个包),找到注册服务的包导入的包,并获取导出该包的包。你可以让这个方法更好一些。