为了账号安全,请及时绑定邮箱和手机立即绑定

无法从 OSGI 包获取类型化的类实例

无法从 OSGI 包获取类型化的类实例

慕少森 2023-10-12 16:47:30
我有以下情况。我的应用程序中需要一个类 A 的实例,该类 A 来自捆绑包 B (osgi),位于该捆绑包中的包 X 中。到目前为止我所做的:我已将捆绑包 B 添加到本地 Maven 存储库,并将其作为“提供”范围的依赖项添加到我的 pom 中。我还添加了 Bundle B 中的包 X,其中 A 类驻留在我的 pom 中,并在 pom.xml 中使用动态导入。这里需要注意一件事 - 包 X 不是从包 B 导出的,但我知道它仍然可以工作,我见过同事这样做,但我还没有那么好。无论如何,我如何尝试获取以下类的实例:Bundle bundle;Class<?> checkClass=bundle.loadClass("full path to class A");TypeOfClassA newClass=checkClass.newInstance();我在这里得到:java.lang.ClassNotFoundException ClassA not found by myapplicationat org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)在org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)但为什么 ?我已经加载了 jar,我正在使用捆绑类加载器,而且如果我将 checkClass 转换为 Object,我可以看到 Class A 的方法和字段,所以看起来不错,我如何获取 A 类的实例?
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

在 OSGi 中,编译时和运行时之间存在差异。在编译时,您会看到自己的 jar 的类以及来自 Maven 的所有依赖项。

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

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

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

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

无论如何,这是一个黑客行为。您应该避免使用另一个包的私有类。


查看完整回答
反对 回复 2023-10-12
?
狐的传说

TA贡献1804条经验 获得超3个赞

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

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

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


查看完整回答
反对 回复 2023-10-12
  • 2 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信