Bundle.loadClass () возвращает экземпляр класса без полей или методов - PullRequest
1 голос
/ 12 октября 2011

Я хочу создать OSGi-фреймворк программно, загрузить Bundle вместе с ним и загрузить класс из этого комплекта. Когда я вызываю Bundle.loadClass(), я получаю значение Class со всеми полями \ методами \ конструктором, установленными на ноль. У него есть только имя. Я не могу получить доступ к каким-либо общедоступным методам и т. Д. Я пробовал использовать Equinox и Felix с одинаковым результатом.

Bundle's MANIFEST:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Activator: org.osgitest.osgitest.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Name: OSGi Test
Bundle-SymbolicName: org.osgitest.osgitest
Bundle-Version: 1.0
Import-Package: org.osgi.framework
Export-Package: org.osgitest.osgitest.test

Настройка фреймворка:

FrameworkFactory ff = new EquinoxFactory();
Map<String, String> config = new HashMap<String, String>(1);
config.put("org.osgi.framework.storage.clean", "onFirstInit");
Framework framework = ff.newFramework(config);
framework.init();
framework.start();

и

FrameworkFactory ff = new org.apache.felix.framework.FrameworkFactory();
Map<String, String> config = new HashMap<String, String>(1);
config.put("org.osgi.framework.storage.clean", "onFirstInit");
Framework framework = ff.newFramework(config);
framework.init();
framework.start();

Загрузка пакета:

Bundle testBundle = framework.getBundleContext().installBundle("file:C:\\org-osgitest-osgitest.jar");
testBundle.start();
Class<?> classOne = testBundle.loadClass("org.osgitest.osgitest.test.ClassOne");
Class<?> activator = testBundle.loadClass("org.osgitest.osgitest.Activator");

Activator Class Экземпляр содержит ссылку на конструктор, но не содержит открытых методов. Имеет public void start(BundleContext c) и public void stop(BundleContext c).

Как я могу загрузить правильные Class? Что я делаю неправильно? Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Class использует некоторую ленивую инициализацию.Class Экземпляр будет заполнен методами / полями только после выполнения getMethods и т. Д. Вот почему я не смог ничего увидеть в отладчике.

Я пытался вызвать public static void main(String[] args) и не сделалбрось мой String[] на Object.Таким образом, это было интерпретировано как Object[], и JVM искала метод с сигнатурой (args[0].class, args[1].class, ... , args[n].class).Вот почему мой метод не был найден.

0 голосов
/ 12 октября 2011

Поскольку пакет - это jar, вы пытались загрузить класс в обычном режиме -classpath? OSGi просто определяет загрузчики классов. ВМ по-прежнему отвечает за создание объектов Class из байт-кодов. Поэтому я не вижу, как каркас OSGi мог «убрать» членов из объекта Class.

...