Je suis en train de changer le chargeur de classe lors de l'exécution:changement 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();
}
}
et:
public class TestProxy {
public void test() {
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
ClassLoader ccl = ClassToLoad.class.getClassLoader();
ClassToLoad classToLoad = new ClassToLoad();
}
}
(InjectingClassLoader est une extension de la classe org.apache.bcel.util .ClassLoader qui devrait charger les versions modifiées des classes avant de lui demander son parent)
e pour rendre le résultat de "approche 1" et "approche 2" exactement le même, mais il ressemble à thread.setContextClassLoader (classLoader) ne fait rien et la "approche 2" utilise toujours le classloader du système (peut être déterminée en comparant tcl et ccl variables lors du débogage).
Est-il possible de faire toutes les classes chargées par le nouveau thread utilisé classloader?
Nit: "réfléchie". Étant donné qu'il y a confusion dans la question concernant le chargeur de classe de contexte, vous pouvez mentionner que setContextClassLoader n'a d'effet que si le thread effectue une opération qui nécessite de le définir (par exemple, créer un SAXParser, effectuer une recherche JNDI, etc.). –
Fixé; réflexivement -> réfléchi. Merci. –