динамическая загрузка классов из плагина ImageJ

У меня возникают проблемы с динамической загрузкой класса Java из динамически загружаемого класса.

Мой класс представляет собой плагин ImageJ, и он динамически загружает другие модули через classloader. У меня есть NoClassDefFoundError при загрузке модуля, который ссылается на что-то, что находится в том же пакете, что и плагин ImageJ.

Что я конкретно делаю:

  1. ImageJ загружает плагин (A)
  2. (A) получает загрузчик системного класса
  3. (A) добавить URL-адрес jar в загрузчик классов
  4. (A) попробуйте загрузить нужный класс (B) в банку, используя Class.forName

Я не могу загрузить класс B, потому что я получаю NoClassDefFoundError, вызванный тем, что B указывает на класс в A, который не был найден в текущем загрузчике классов.

Я думаю, мне нужно использовать тот же загрузчик классов ImageJ, который используется для загрузки плагинов, в первую очередь, чтобы иметь возможность загружать мои модули и по-прежнему находить ссылки на банки, ранее загруженные ImageJ. Я хотел бы сделать это без перекомпиляции ImageJ.

Есть ли способ решить эту проблему, не добавляя код ImageJ или не изменяя его?

пример псевдоклассов

package a;
class A extends PlugInFrame {}


package a;
class C extends MyOwnPlugIn {}

package b;
import a;
class B extends C {}

person Rasael    schedule 25.01.2013    source источник


Ответы (2)


Самый простой способ — не загружать класс динамически, а напрямую, используя его.

При отсутствии этого метода лучший способ — убедиться, что все файлы .jar находятся в папке plugins/ImageJ (или, если вы используете Fiji, файлы .jar без плагинов находятся в jars/) и использовать загрузчик классов плагинов ImageJ: IJ.getClassLoader ().loadClass("blub");

Обратите внимание, что ваш шаг 3 - это большое нет-нет: вы никогда не должны добавлять элементы в путь к классам загрузчика системных классов.

Также обратите внимание, что со всеми экспертами ImageJ можно связаться по адресу [email protected], а не через StackOverflow.

person Johannes Schindelin    schedule 26.01.2013

Я не уверен, нужно ли вам динамически загружать эти классы, но чтобы получить загрузчик классов A

ClassLoader classLoader = A.getClass().getClassLoader()

Затем используйте это для создания B, имея в виду, что B должен иметь конструктор без аргументов.

Почему бы вам не собрать файл jar вашего плагина, включающий B? Я создал кучу плагинов и обычно добавляю зависимости, а затем создаю jar-файл плагина, включающий все необходимые зависимости.

person Codey McCodeface    schedule 25.01.2013