好的。所以我有一个 org.osgi.framework.launch.Framework 我以下列方式以编程方式创建的。
framework = ServiceLoader.load(FrameworkFactory.class).iterator().next().newFramework(getFrameworkConfig());
framework.start();
installBundles(BUNDLES_PATH); // installs bundles from a directory, by searching BUNDLES_PATH recursively for JARs
我想要做的是有一个通用的 loadClass 方法(作为此类中的一个方法),它将扫描已安装的包,读取它们的 Export-Package: 声明,并根据类的 packageName 调用正确的包的 loadClass 方法我作为参数传递。
有没有聪明的方法来做到这一点?还是这样做更好:
Class<?> c = null;
// else try every installed bundle one-by-one
for (Bundle bundle : framework.getBundleContext().getBundles()) {
try {
c = bundle.loadClass(className);
} catch (ClassNotFoundException e) {
// OK, move onto next bundle
continue;
}
if (c != null)
break;
}
return c;
我意识到我可以使用服务让捆绑包发布其可用服务并让框架使用 getAllServiceReferences() 查询服务,但这对程序员来说工作量更大,我不确定我是否想走声明式服务的路线。