【问题标题】:Cannot get typed Instance of class from OSGI bundle无法从 OSGI 包中获取类型化的类实例
【发布时间】:2019-10-09 19:27:09
【问题描述】:

我有以下情况。我的应用程序中需要一个类 A 的实例,而这个类 A 来自 Bundle B (osgi),并且位于该 Bundle 中的包 X 中。 到目前为止我做了什么: 我已将包 B 添加到本地 maven 存储库,并将其添加到我的 pom 作为具有“提供”范围的依赖项。 我还添加了来自 Bundle B 的包 X,其中类 A 驻留在我的 pom 中,并在我的 pom.xml 中使用 Dynamic-import。 这里需要注意的一件事 - 包 X 不是从 Bundle B 导出的,但我知道它仍然可以工作,我见过同事这样做,但我还没有那么好。

无论如何我是如何尝试获取以下类的实例:

Bundle bundle;
Class<?> checkClass=bundle.loadClass("full path to class A");

TypeOfClassA newClass=checkClass.newInstance();

我得到了:

java.lang.ClassNotFoundException ClassA not found by myapplication
at 

org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532) 在

org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)

但是为什么?我已经加载了 jar,我正在使用 bundle 类加载器,如果我将 checkClass 转换为 Object,我可以看到 Class A 的方法和字段,看起来不错,我怎样才能获得 Class A 的实例?

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    当你写类似 PluginA test=(PluginA) classloader.loadclass("PluginA").newInstance() 那么你需要实际导入 PluginA 类,正如 Christian 所提到的,只有从它所在的包中导出它才有可能。以下应该可以工作:

    Object test= classloader.loadclass("PluginA").newInstance()
    

    然后您将需要使用反射来访问类的方法等。

    【讨论】:

    • 是的,这是正确的,事实证明它只有在我使用 InvokationHandler 和 Proxy.newProxyInstance 的反射时才有效,谢谢
    【解决方案2】:

    在 OSGi 中,编译时间和运行时间是有区别的。在编译时,您会看到自己的 jar 的类以及来自 maven 的所有依赖项。

    在运行时,bundle 默认只能看到它自己的类。任何其他包都需要 Manifest 中的 Import-Package 语句。通常,这是在您使用类时由 bnd 自动创建的。只要有可能,您就应该依赖这种自动化。

    您的情况当然不同,因为您要访问的包不是由捆绑 B 导出的。在这种情况下,无法通过您自己捆绑的捆绑类加载器到达 A 类。

    相反,您需要使用包 B 的包类加载器。例如,您可以从 BundleContext 中获取包 B。然后就可以加载类了。

    另一个选择是你使用从Bundle B中导出的类C,并使用类C的类加载器来加载类A。

    在任何情况下,这是一个 hack。你应该避免使用另一个包的私有类。

    【讨论】:

    • 嗨,Christian,感谢您的回答。我尝试使用 Bundle 类加载器,并且我能够获得 Class> 。问题是我再次无法转换为 A 类,让我们打电话它是 PluginA 类。如果我去 PluginA test=(PluginA)glassloader.loadclass(PluginA).newInstance,它会再次抛出 ClassNotFound
    • 所以你是用A类所在的bundle来加载类的?
    • 嗨,克里斯蒂安,没错
    • 感谢大家的帮助,虽然没有想象中那么简单,但总能学到新东西
    猜你喜欢
    • 2013-12-12
    • 2015-02-28
    • 2011-08-14
    • 2013-07-05
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2014-12-30
    • 2019-07-26
    相关资源
    最近更新 更多