как загрузить тот же класс из различных банок

У меня есть класс Client.java в двух различных банках jar1 и jar2 Теперь во время выполнения, как которое я хочу решить который Client.class, загруженный

if (country==india){
         // load Client class of jar1
) else{
        load client class from jar2 
}

я могу сделать это...

6
задан Mitch Dempsey 18 May 2010 в 01:28
поделиться

3 ответа

Если два класса имеют одно и то же имя пакета, то есть com.mycompany.Client, то вы попадаете в ситуацию, когда несколько произвольно загружается версия клиента. Все сводится к тому, что находится в пути к классам первым. Это адская ситуация JAR http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell .

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

Итог: избегайте ситуации, если можете, и выбирайте путь наименьшего сопротивления, если не можете.

Если классы действительно имеют разные имена пакетов, @Casidiablo предоставил хороший ответ.

7
ответ дан 8 December 2019 в 17:19
поделиться

Вам нужно будет использовать «полное» имя пути. Например:

if (country==india){
         name.first.package.Client client = new name.first.package.Client();
} else{
         name.second.package.Client client = new name.second.package.Client();
}

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

4
ответ дан 8 December 2019 в 17:19
поделиться

Если у вас действительно есть две копии класса с точно таким же полным именем в двух банках, то ...

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

3
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: