Osgi 一个bundle是否有办法从ServiceReference获取另一个bundle的bundle实例?
我试图创建一个包来监视服务注册,并根据服务接口的API包中嵌入的某些元数据执行一些额外的任务。元数据主要由一个或多个属性文件组成,因此我的想法是使用Bundle.findEntries,但由于元数据嵌入到API捆绑包中,因此我不能像ServiceReference.getBundle.findEntries这样做,因为这将尝试在服务实现捆绑包中而不是API捆绑包中查找属性 我考虑过从ServiceReference ObjectClass属性获取服务API类名,然后使用包管理服务或FrameworkUtil.getBundle,但这两者都需要一个类,但如何获取服务接口的类?执行此工作的捆绑包可能尚未导入类的包,因此Class.forName将无法工作Osgi 一个bundle是否有办法从ServiceReference获取另一个bundle的bundle实例?,osgi,Osgi,我试图创建一个包来监视服务注册,并根据服务接口的API包中嵌入的某些元数据执行一些额外的任务。元数据主要由一个或多个属性文件组成,因此我的想法是使用Bundle.findEntries,但由于元数据嵌入到API捆绑包中,因此我不能像ServiceReference.getBundle.findEntries这样做,因为这将尝试在服务实现捆绑包中而不是API捆绑包中查找属性 我考虑过从ServiceReference ObjectClass属性获取服务API类名,然后使用包管理服务或Framewo
我的另一个选项是监视bundle和服务事件:第一个选项创建包含元数据的bundle注册表,第二个选项在注册服务时使用第一个选项。在走这条路之前,我想看看是否有更简单的方法。免责声明:我还没有尝试过这个方法,但我有理由相信它会起到作用 您可以从ServiceReference的ObjectClass获取packagename,因此现在我们有了它,我们可以在框架中找到该包。给定PackageAdmin PackageAdmin,您可以执行以下操作
public Bundle getExporterOf(String package, ServiceReference ref) {
ExportedPackage[] packages = packageAdmin.getExportedPackages(packageName);
if (packages == null) {
return null;
}
for (ExportedPackage package : packages) {
Bundle[] importers = package.getImportingBundles()) {
if (importers == null) {
continue;
}
for (Bundle bundle : importers) {
if (bundle.getBundleId() == ref.getBundle().getBundleId()) {
return package.getExportingBundle
}
}
}
}
我们在这里要做的是找到具有给定包名的所有包可能有多个包,找到注册服务的包导入的包,然后获取导出该包的包。你也许可以把这个方法做得更好一些。免责声明:我还没有尝试过这个方法,但我有理由相信它应该能起到作用 您可以从ServiceReference的ObjectClass获取packagename,因此现在我们有了它,我们可以在框架中找到该包。给定PackageAdmin PackageAdmin,您可以执行以下操作
public Bundle getExporterOf(String package, ServiceReference ref) {
ExportedPackage[] packages = packageAdmin.getExportedPackages(packageName);
if (packages == null) {
return null;
}
for (ExportedPackage package : packages) {
Bundle[] importers = package.getImportingBundles()) {
if (importers == null) {
continue;
}
for (Bundle bundle : importers) {
if (bundle.getBundleId() == ref.getBundle().getBundleId()) {
return package.getExportingBundle
}
}
}
}
我们在这里要做的是找到具有给定包名的所有包可能有多个包,找到注册服务的包导入的包,然后获取导出该包的包。您可能可以将该方法改进一点。我从未考虑过使用PackageAdmin来获取导出的软件包,这可以满足我的需要。谢谢我从来没有考虑过使用PackageAdmin来获取导出的软件包,这可以满足我的需要。谢谢