Ich versuche, die Class Loader zur Laufzeit wechseln:ändern Classloader
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();
}
}
und:
public class TestProxy {
public void test() {
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
ClassLoader ccl = ClassToLoad.class.getClassLoader();
ClassToLoad classToLoad = new ClassToLoad();
}
}
(InjectingClassLoader ist eine Klasse Verlängerung der org.apache.bcel.util .ClassLoader, die die geänderten Versionen der Klassen laden sollten, bevor sie ihre Eltern für sie fragen)
würde ich lik e, um das Ergebnis von "Ansatz 1" und "Ansatz 2" genau gleich zu machen, aber es sieht aus wie thread.setContextClassLoader (classLoader) tut nichts und die "Approach 2" verwendet immer den System-Classloader (kann durch Vergleich tcl ermittelt werden und ccl Variablen während des Debuggens).
Ist es möglich, alle Klassen durch neue Thread-Verwendung gegeben Klassenlader gemacht zu machen?
Nit: "reflektierend". Da in der Frage zum Kontextklassenladeprogramm Verwirrung herrscht, können Sie erwähnen, dass setContextClassLoader keine Auswirkungen hat, es sei denn, der Thread führt eine Operation durch, die das Festlegen erfordert (z. B. Erstellen eines SAXParser, Ausführen einer JNDI-Suche usw.). –
behoben; reflexiv -> nachdenklich. Vielen Dank. –