【问题标题】:Is there a way for one bundle to get the Bundle instance for another bundle from a ServiceReference?有没有办法让一个包从 ServiceReference 获取另一个包的 Bundle 实例?
【发布时间】:2011-01-13 15:11:11
【问题描述】:

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

我曾考虑从ServiceReference ObjectClass 属性中获取服务 API 类名称,然后使用 Package Admin 服务或 FrameworkUtil.getBundle(),但这两者都需要 Class--但我如何获得 @ 987654326@的服务接口?执行这项工作的包可能没有导入该类的包,所以Class.forName() 将不起作用。

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

【问题讨论】:

    标签: osgi


    【解决方案1】:

    免责声明:我没有尝试过,但我有理由相信它应该可以完成这项工作。

    你可以从ServiceReferenceObjectClass获取包名,所以现在我们有了,我们可以在框架中找到包。给定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 来获取 ExportedPackages,这可以满足我的需要。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多