我有一个NetBeans OSGi maven项目,需要从运行时从文件系统加载的另一个OSGi jar运行一个类方法。
我试着看一些类似的问题:
java: is there a framework that allows dynamically loading and unloading of jars (but not osgi)?
How to dynamically load Java classes at Runtime in OSGI framework?
但是他们似乎没有回答我如何访问我正在加载的包中的方法。
他们确实给我一个关于如何加载捆绑包的好方向,但OSGi上的文档也是如此。我没有找到的是如何从我安装的软件包中的特定类运行特定方法。反射似乎不起作用,我读过它可能不是一个好主意,无论如何它给了我着名的ClassNotFoundException。
还有整个Manifest导入和导出,如此问题和其他问题所示 OSGi: programmitically add imports to a bundle
我不能使用bndtools,因为我使用netbeans,我也不确定它是否能完成这项工作。我也不确定OSGi服务是否与它有任何关系。
提前感谢任何帮助我不要拔头发的人:)
答案 0 :(得分:3)
所以我假设你已经加载并启动了捆绑包。下一步是获取捆绑包的类加载器:
ClassLoader loader = bundle.adapt(BundleWiring.class).getClassLoader();
使用这个类加载器,你可以按名称加载类,并使用反射来调用它上面的方法。
请同时考虑这对OSGi来说不是一个好的架构。如果您已经在编译时知道另一个bundle和类,那么只需使用Import-Package并使用new实例化另一个类。
如果您在运行时不知道其他bundle和类但是可以控制所有bundle源,那么请使用服务方法。您可以拥有捆绑包共享的公共接口。另一个bundle可以将其功能作为OSGi服务提供,然后您可以使用共享接口绑定和访问它。