Я пытаюсь переключить загрузчик класса во время выполнения: < /p>
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();
}
}
< /code>
и: < /p>
public class TestProxy {
public void test() {
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
ClassLoader ccl = ClassToLoad.class.getClassLoader();
ClassToLoad classToLoad = new ClassToLoad();
}
}
< /code>
( injectingclassloader < /em> - это класс, расширяющий org.apache.bcel.util.classloader < /em>, который должен загрузить модифицированные версии классов, прежде чем спрашивать его родителя для них) < /p>
Я хотел бы сделать результат, чтобы он был на подходе 1, но это то же самое. thread.setContextClassLoader (ClassLoader) ничего не делает, и «подход 2» всегда использует системный класс -загрузчик (можно определить, сравнивая переменные TCL и CCL во время отладки).
Возможно ли сделать все классы, загруженные новым использованием.>
Подробнее здесь: https://stackoverflow.com/questions/282 ... lassloader