【问题标题】:How to get classloader for a bundle in equinox?如何在 Equinox 中获取捆绑包的类加载器?
【发布时间】:2010-12-02 23:07:38
【问题描述】:

我已经为此阅读了很多 Equinox 代码,但仍然无法找到一种在 eclipse Equinox 设置中获取 osgi 包的类加载器的简单方法。有吗?

【问题讨论】:

    标签: eclipse osgi classloader bundle equinox


    【解决方案1】:

    简短的回答(当然对于 OSGi 4.1,不确定 4.2)是您无法获得捆绑包的类加载器。然而Bundle 接口公开了一个@987654321@ 方法,这将允许您编写一个类加载器来包装捆绑API 并委托给该loadClass() 方法。或者您可以节省一些时间并改用 Spring DM 的 @987654322@ 类。

    【讨论】:

      【解决方案2】:

      在普通的java代码中,你可以得到加载给定对象的类加载器

      object.getClass().getClassLoader();
      

      甚至只是

      SomeType.class.getClassLoader();
      

      同样适用于 Equinox,只需使用来自您感兴趣的包的对象或类型。

      【讨论】:

      • 但是你有一个引导问题。您如何获得第一个实例?
      • 如果你依赖于另一个包,你可以直接引用另一个类(SomeType.class)osgi类加载器在包之间委托,所以它仍然来自另一个类加载器。如果您没有依赖项,则需要获取 Bundle 对象(使用 PackageAdmin)并使用另一个答案中提到的 Bundle#loadClass。
      • J2SE 类加载不适合 J2EE。 stackoverflow.com/questions/34787419/…
      • 这不是正确的类加载器。用于加载 Bundle 类的类加载器通常与充当类加载器的捆绑包不同。更一般地说,ClassLoader.class 的类加载器通常与任何给定的类加载器实例不同。虽然在简单的环境中,它们可能是相同的,但在分区环境(OSGi、JavaEE)中它们会有所不同。
      【解决方案3】:

      在 OSGi 4.3 中,您可以使用:

      bundle.adapt(BundleWiring.class).getClassLoader()
      

      【讨论】:

        【解决方案4】:

        bundle的类加载器可以通过BundleWiring接口获取。这是一个简短的例子:

        Bundle bundle = bundleContext.getBundle();
        BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
        ClassLoader classLoader = bundleWiring.getClassLoader();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-10
          • 2013-05-29
          • 2010-10-15
          • 2017-05-01
          • 2013-03-12
          • 2012-07-09
          • 1970-01-01
          • 2018-12-08
          相关资源
          最近更新 更多