Я пытаюсь переключить загрузчик классов во время выполнения:
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" всегда использует системный загрузчик классов (может быть определен путем сравнения переменных tcl и ccl при отладке).
Можно ли заставить все классы, загруженные новым потоком, использовать данный загрузчик классов?