OK. Итак, у меня есть 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: и вызывать метод loadClass правильного пакета, основанный на packageName класса, который я передаю в качестве параметра.
Есть ли умный способ сделать это? или лучше просто сделать это:
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 (), но это больше для программиста, и я не уверен, что хочу идти по пути Декларативные услуги.