Загрузить методы и классы из сборки ванны в Java - PullRequest
0 голосов
/ 23 февраля 2012

Я использую Eclipse, и у меня есть две библиотеки, включенные в мой проект, foo.jar и bar.jar. В обоих JAR-файлах есть класс FooBar.java, который включает метод getFoobar (Object xy).

Теперь я хотел бы загрузить метод getFoobar (Object xy) либо из foo.jar, либо из bar.jar на основе файла свойств:

config.properties: выбор = Foo

Если choice == foo, то должен быть выбран метод Foo.jar, в противном случае - метод getFoobar (Object xy) из Bar.java. Чтобы усложнить ситуацию, метод getFoobar (Object xy) имеет в своем объявлении метода объекты, загруженные из другого JAR-файла, который включен в foo.jar (и bar.jar соответственно).

Итак, мой вопрос. Как я могу получить методы JAR соответственно по Reflections? Я еще не нашел решение. Есть ли способ решить эту проблему?

Спасибо.

Эмр

Ответы [ 4 ]

0 голосов
/ 23 февраля 2012

Как я могу получить методы JAR соответственно по Reflections?

Вы не можете.

Отражение не позволяет вам выбирать между двумя версиямикласса.На самом деле, что касается JVM, существует только одна версия;то есть тот, который появляется раньше в пути к классам.

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

  • Если вам удастся загрузить обе версии класса в работающее приложение, вы обнаружите, что экземпляры соответствующих классов имеют разныетипов, и вы не сможете убедить JVM в противном случае.

  • Когда ваше приложение загружает другой класс, который статически зависит от одного из этих классов, он будет привязан к версиикласс, который находится на пути к классам загрузчика классов зависимых классов.И ты не можешь это изменить.Таким образом, использование имени класса в объявлениях / typecasts / etc в зависимом классе будет ссылаться на версию класса, найденную загрузчиком классов зависимых классов, а не на другую.

В результате вы не можете использовать эти одноименные классы, как обычные классы ... особенно, если обе версии должны быть загружены в одну и ту же JVM.Лучше дать двум версиям класса разные имена.Вы ничего не получаете, делая имена классов одинаковыми.

0 голосов
/ 23 февраля 2012

Напишите ваш ClassLoader, который читает свойство.Кроме того, вы можете использовать опцию -D в аргументах jvm

-Dchoice=foo 

, а в коде, который загружает класс из foo.jar или из bar.jar, вы можете включить это значение свойства:

String choice = System.getProperty("choice");
if (Main.CHOICE_FOO.equalsIgnoreCase(choice)) {...}
...
0 голосов
/ 23 февраля 2012

OSGI может дать вам аналогичную возможность.

0 голосов
/ 23 февраля 2012

Вы можете загружать только один или другие методы, не усложняя загрузчики классов. Простой обходной путь - переименовать пакет одной или обеих библиотек с помощью jarjar . Это позволяет вам иметь все в foo.jar, начинаться с foo., а все bar.jar начинается с bar., и это позволяет избежать любая путаница Я видел, как раньше можно было загружать несколько версий Xerces в зависимости от конфигурации (и использовать их одновременно в одном приложении)

...