Я пытаюсь переключить загрузчик класса во время выполнения:Изменение загрузчика классов
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, который должен загрузить модифицированные версии классов, прежде чем запрашивать у них родительский элемент)
I 'd хотел бы сделать результат «подхода 1» и «приблизить 2» точно таким же, но он выглядит как thread.setContextClassLoader (classLoader) ничего не делает, и «подход 2» всегда использует системный загрузчик классов (может быть определен сравнение переменных tcl и ccl во время отладки).
Можно ли создать все классы, загруженные новой веткой, используемой данным загрузчиком классов?
Нит: «Отражающе». Учитывая, что в вопросе о загрузчике класса контекста есть путаница, вы можете упомянуть, что setContextClassLoader не имеет эффекта, если поток не выполняет некоторую операцию, которая требует ее установки (например, создание SAXParser, выполнение JNDI-поиска и т. Д.). –
Исправлено; рефлексивно -> рефлексивно. Благодарю. –