我正在尝试创建一个监视服务注册的捆绑包,并根据服务接口的API捆绑中嵌入的某些元数据执行一些其他任务。元数据主要由一个或多个属性文件组成,所以我的想法是使用Bundle.findEntries()
,但由于元数据嵌入在API包中,我不能像ServiceReference.getBundle().findEntries()
这样做,因为这会尝试查找服务实现包中的属性,而不是在API包中。
我考虑过从ServiceReference
ObjectClass属性获取服务API类名,然后使用Package Admin服务或FrameworkUtil.getBundle()
,但这两者都需要Class
- 但是如何获得服务接口的Class
?正在执行此工作的软件包可能尚未导入Class的软件包,因此Class.forName()
将无效。
我的另一个选择是监视捆绑和服务事件:第一个创建包含元数据的包的注册表,第二个使用注册服务时的第一个。在走这条路之前,我正在寻找一种更简单的方法。
答案 0 :(得分:4)
免责声明:我没有尝试过,但我有理由相信它应该可以胜任。
您可以从ServiceReference
的{{1}}获取包名,所以现在我们可以在框架中找到包。给定ObjectClass
,您可以执行类似
PackageAdmin packageAdmin
我们在这里做的是找到具有给定包名的所有包(可能有多个包),找到注册服务的包导入的包,并获取导出该包的包。你可以让这个方法更好一些。