Ändern classloader

Ich versuche, schalten Sie den class loader zur Laufzeit:

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, die sich die org.apache.bcel.util.ClassLoader dem laden sollte die modifizierte Versionen der Klassen, bevor Sie Fragen, es ist der Eltern für Sie)

Ich möchte gern das Ergebnis von "Methode 1" und "Methode 2" genau das gleiche, aber es sieht aus wie thread.setContextClassLoader(classLoader) nichts tut und die "Methode 2" verwendet immer den system-classloader (können bestimmt werden durch den Vergleich von tcl und ccl Variablen während des Debuggens).

Ist es möglich, alle Klassen geladen neuen thread angesichts classloader?

InformationsquelleAutor Chris | 2010-05-12
Schreibe einen Kommentar