Изменить classpath во время выполнения - управление порядком загрузки класса - PullRequest
2 голосов
/ 14 февраля 2011

Можно ли контролировать порядок загрузки классов во время выполнения?Например: у меня есть класс SomeClass, который находится в двух jaras: SomeLibrary-1.0.jar и SomeLibrary-2.0.jar.У класса есть статический метод getVersion (), который возвращает текущую версию SomeLibrary.Я использую найденное решение здесь для изменения пути к классам во время выполнения.Теперь, когда я запускаю код:

public static void main(String[] args) {
    ClassPathHacker.addFile("SomeLibrary-1.0.jar");
    ClassPathHacker.addFile("SomeLibrary-2.0.jar");
    System.out.println(SomeClass.getVersion());
}

Я ожидаю увидеть вывод 2.0, но вместо этого есть 1.0.Это потому, что загрузчик классов использует первый класс, найденный в пути к классам.Можно ли управлять механизмом загрузки загруженных классов или уже загруженным классом перезаписи?

1 Ответ

1 голос
/ 14 февраля 2011

У вас есть две версии одного и того же JAR, вам нужно использовать разные экземпляры ClassLoader. взлом SystemClassLoader не поможет вам в этом случае.

Например, вы можете загрузить каждый jar в его собственный экземпляр URLClassLoader:

URLClassLoader ucl1 = new URLClassLoader(new URL[] { new URL("SomeLibrary-1.0.jar") });
URLClassLoader ucl2 = new URLClassLoader(new URL[] { new URL("SomeLibrary-2.0.jar") });

Class<?> cl1 = ucl1.loadClass("org.example.SomeClass");
Class<?> cl2 = ucl2.loadClass("org.example.SomeClass");

Method m1 = cl1.getMethod("getVersion");
System.out.println("v1: " + m1.invoke(cl1));
Method m2 = cl2.getMethod("getVersion");
System.out.println("v2: " + m2.invoke(cl1));
...