Java Class Loader - PullRequest
       7

Java Class Loader

1 голос
/ 01 августа 2011

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

Eample :
ClassLoader :-TestClassLoaderFirst
package src.test.com;
class TestClass is present in A.jar 
TestClass{
   public void dispaly(){
      System.out.println("In A.jar ")
   }
}


and b.jar.
ClassLoader :-TestClassLoaderSecond
package src.test.com;
Class TestClass{
   public void present(){
      System.out.println("")
}

Ответы [ 2 ]

1 голос
/ 01 августа 2011

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

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

Однако, это полная боль. Если вообще возможно, вам следует переименовать один из классов, чтобы избежать конфликта имен. Я бы соблазнился сделать это, даже если бы это означало перестройку проекта с открытым исходным кодом. (Измените имя класса из проекта, который проще всего перестроить, чтобы сэкономить время в будущем.)

0 голосов
/ 01 августа 2011

Как сказал Джон Скит (и вам действительно стоит послушать человека с 327k!), Не делайте этого.Но если вы должны ...
Предполагая, что ваши классы выглядят как

public class TestClass {
    public static void display() {
        System.out.println("In A.jar ");
    }
}

и скомпилированы в target / A.jar, и что-то подобное происходит с TestClass в B.jar, вы можете создатьОсновной класс в вашем собственном пакете, как это:

public class Main {

    public static void main(String[] args) throws MalformedURLException, IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
        URL urlA = new URL("file:target/A.jar");
        URL urlB = new URL("file:target/B.jar");
        URLClassLoader clA = new URLClassLoader(new URL[] { urlA });
        URLClassLoader clB = new URLClassLoader(new URL[] { urlB });

        clA.loadClass("TestClass").getMethod("display", (Class<?>[]) null).invoke(null, (Object[]) null);
        clB.loadClass("TestClass").getMethod("display", (Class<?>[]) null).invoke(null, (Object[]) null);
    }
}

, и вы получите

В A.jar
В B.jar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...