Osgi 一个bundle是否有办法从ServiceReference获取另一个bundle的bundle实例?

Osgi 一个bundle是否有办法从ServiceReference获取另一个bundle的bundle实例?,osgi,Osgi,我试图创建一个包来监视服务注册,并根据服务接口的API包中嵌入的某些元数据执行一些额外的任务。元数据主要由一个或多个属性文件组成,因此我的想法是使用Bundle.findEntries,但由于元数据嵌入到API捆绑包中,因此我不能像ServiceReference.getBundle.findEntries这样做,因为这将尝试在服务实现捆绑包中而不是API捆绑包中查找属性 我考虑过从ServiceReference ObjectClass属性获取服务API类名,然后使用包管理服务或Framewo

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

我考虑过从ServiceReference ObjectClass属性获取服务API类名,然后使用包管理服务或FrameworkUtil.getBundle,但这两者都需要一个类,但如何获取服务接口的类?执行此工作的捆绑包可能尚未导入类的包,因此Class.forName将无法工作


我的另一个选项是监视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来获取导出的软件包,这可以满足我的需要。谢谢