Я пытаюсь переключить загрузчик классов во время выполнения:
public class Test {
public static void main(String[] args) throws Exception {
final InjectingClassLoader classLoader = new InjectingClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
Thread thread = new Thread("test") {
public void run() {
System.out.println("running...");
// approach 1
ClassLoader cl = TestProxy.class.getClassLoader();
try {
Class c = classLoader.loadClass("classloader.TestProxy");
Object o = c.newInstance();
c.getMethod("test", new Class[] {}).invoke(o);
} catch (Exception e) {
e.printStackTrace();
}
// approach 2
new TestProxy().test();
};
};
thread.setContextClassLoader(classLoader);
thread.start();
}
}
и:
public class TestProxy {
public void test() {
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
ClassLoader ccl = ClassToLoad.class.getClassLoader();
ClassToLoad classToLoad = new ClassToLoad();
}
}
(InjectingClassLoader – это класс, расширяющий класс org.apache.bcel.util.ClassLoader, который должен загружать модифицированные версии классов, прежде чем запрашивать их у родителя)
Я хотел бы, чтобы результат "подхода 1" и "подхода 2" был точно таким же, но похоже, что thread.setContextClassLoader(classLoader) ничего не делает, а "подход 2" всегда использует систему classloader (можно определить, сравнивая переменные tcl и ccl во время отладки).
Можно ли сделать так, чтобы все классы, загружаемые новым потоком, использовали данный загрузчик классов?