Changement de chargeur de classe

Je suis en train de basculer le chargeur de classe au moment de l'exécution:

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 classe étendant la org.apache.bcel.util.Chargeur de classe qui doit charger les versions modifiées de classes avant de lui demander de parent pour eux)

Je tiens à rendre le résultat de "1" et "méthode 2" exactement les mêmes, mais il semble que fil.setContextClassLoader(classLoader) ne fait rien et la "méthode 2" utilise toujours le système de chargeur de classes (peut être déterminé par la comparaison des tcl et de la ccl variables pendant le débogage).

Est-il possible de faire tous les classes chargées par le nouveau thread utilisation du chargeur de classe?

OriginalL'auteur Chris | 2010-05-12