Java ClassLoader ändern

Ich habe einige Klasse A:

public class A {
    public A(String str) {
        System.out.println("Create A instance: " + str);
    }

    public void methodA() {
        System.out.println("#methodA1()");
    }
}

Und meine Klasse loader Umsetzung:

public class MyClassLoader extends ClassLoader {
    public MyClassLoader() {    
        super();
    }

    @Override
    public synchronized Class<?> loadClass(String name) 
            throws ClassNotFoundException {

        System.out.println("Load: " + name);

        return super.loadClass(name);
    }
}

Und jetzt versuche ich zu ändern, Standard-class-loader im aktuellen thread:

import java.util.ArrayList;
import java.util.List;

public class ChangeLoaderTest {
    public static void main(String[] args) {
        //Save class loader so that we can restore later.
        ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();

        MyClassLoader newLoader = new MyClassLoader();
        try {
            //Set new classloader.
            Thread.currentThread().setContextClassLoader(newLoader);

            //My class.
            A a = new A("1");
            a.methodA();

            //Standard Java class.
            List<Integer> list = new ArrayList<Integer>();
            list.add(2);
            list.add(3);
        } finally {
            //Restore.
            Thread.currentThread().setContextClassLoader(oldLoader);
        }
    }
}

Sowie ChangeLoaderTest Ausgabe:

Create A instance: 1
#methodA1()

Niemand

Load: ...

Warum? Wie ich das ändern kann ClassLoader in einigen thread?

  • "Ich habe einige Klasse Ein:" Während einige Leute denken, es ist besser, 'Abstrakt ein problem" auf den Punkt können Sie Ausdrücken, wie stumpf die Symbole, habe ich lieber ein paar Rahmen, der hilft, zu erklären, was in der Klasse A macht, die Sie laden möchten, ist es dynamisch. I. E. Klasse A könnte ein UserDefinedPlugIn - letztere bietet einige Kontext, ersteres nicht.
  • Ok, ich kann das erklären Zusammenhang mit dieser Frage. Ich habe Klasse, die liest die Bilder in BufferedImage. Manchmal ist es ImageIO.read(file), manchmal ist es Sanselan.getBufferedImage(file). Ich habe meine eigene Klasse zum speichern von Bildern und ich müsste BuffredImage aus Datei, dann kopieren Sie Daten aus BufferedImage zu meinem Objekt. Ich möchte mit einigen proxy-Klasse, alle fangen #get(...) Methoden aufrufen, um Daten zu speichern, die in meinem Objekt.
InformationsquelleAutor dzav | 2012-04-17
Schreibe einen Kommentar