У меня есть класс Client.java в двух различных банках jar1 и jar2 Теперь во время выполнения, как которое я хочу решить который Client.class, загруженный
if (country==india){
// load Client class of jar1
) else{
load client class from jar2
}
я могу сделать это...
Если два класса имеют одно и то же имя пакета, то есть com.mycompany.Client, то вы попадаете в ситуацию, когда несколько произвольно загружается версия клиента. Все сводится к тому, что находится в пути к классам первым. Это адская ситуация JAR http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell .
Это хорошая ситуация, которую следует избегать, но если вам абсолютно необходимы разные версии одного и того же класса, есть способы сделать это. Один из способов - использовать собственный загрузчик классов, и загрузчик классов будет знать, какую версию вам нужно сделать. Это нетривиальная задача, и с ней может быть сложно справиться. Платформа OSGi является альтернативой, помогающей справиться с этим (она использует собственные загрузчики классов под капотом), но я бы не стал ее использовать, если у вас есть только один экземпляр класса, поскольку это еще одна структура, которая требует времени и обслуживания.
Итог: избегайте ситуации, если можете, и выбирайте путь наименьшего сопротивления, если не можете.
Если классы действительно имеют разные имена пакетов, @Casidiablo предоставил хороший ответ.
Вам нужно будет использовать «полное» имя пути. Например:
if (country==india){
name.first.package.Client client = new name.first.package.Client();
} else{
name.second.package.Client client = new name.second.package.Client();
}
В любом случае ... Я бы старался избегать таких вещей ... которые затрудняют чтение и поддержку вашего кода.
Если у вас действительно есть две копии класса с точно таким же полным именем в двух банках, то ...
Если вы хотите быть в безопасности, вам не следует помещать либо из них в пути к классам загрузчика классов по умолчанию. Вам нужно будет создать два дополнительных загрузчика классов и поместить в каждый из них по одной банке. Вам нужно будет получить класс для двух классов, и вам нужно будет использовать отражение, чтобы создать экземпляр того, который вы хотите.