2010-07-04 16 views
7

Ich habe einige Java-Byte-Code (so kompilierte Java-Quelle), die in meinem Programm generiert wird. Jetzt möchte ich diesen Byte-Code in die aktuell laufende Java-VM laden und eine bestimmte Funktion ausführen. Ich bin mir nicht sicher, wie ich das erreichen soll, ich habe ein wenig in die Java Classloader gegraben, aber keinen geraden Weg gefunden.Laden Java-Byte-Code zur Laufzeit

Ich fand eine Lösung, die eine class-Datei auf der Festplatte nimmt, aber der Bytecode, den ich bekam, ist in einem Byte-Array und ich möchte es nicht auf die Festplatte schreiben, sondern stattdessen direkt verwenden.

Danke!

+0

ich unter diesem Link denken Überlastungen sollten Sie finden, was Sie suchen: http: //tutorials.jenkov. com/java-reflection/dynamic-class-loading-reloading.html Sehen Sie sich den letzten Abschnitt "ClassLoader Load/Reload Example" an. –

+0

Meine Frage war irgendwie unklar: Ich habe keine Klassen-Datei, sondern ein Byte-Array und möchte es direkt laden. Danke trotzdem! – theomega

+0

Und ich bin mir ziemlich sicher, dass mein Link genau das zur Verfügung stellt. Zumindest habe ich das durch es gefunden: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html#defineClass (byte [], int, int) Auch Sie können Speichern Sie Ihr Byte-Array natürlich immer in einem temporären Verzeichnis. –

Antwort

9

müssen Sie eine benutzerdefinierte Class Loader schreiben, die die Findclass Methode

public Class findClass(String name) { 
    byte[] b = ... // get the bytes from wherever they are generated 
    return defineClass(name, b, 0, b.length); 
} 
+0

Danke, klingt wie ein Weg zu bekommen, aber es gibt keinen direkten Weg ohne einen custon ClassLoader zu schreiben? – theomega

+0

mindestens keine ich habe bis jetzt gefunden –

+0

Funktioniert sehr gut, danke! – theomega

2

Wenn der Byte-Code nicht im Klassenpfad des ausgeführten Programms enthalten ist, können Sie URLClassLoader verwenden. Von http://www.exampledepot.com/egs/java.lang/LoadClass.html

// Create a File object on the root of the directory containing the class file 
File file = new File("c:\\myclasses\\"); 

try { 
    // Convert File to a URL 
    URL url = file.toURL();   // file:/c:/myclasses/ 
    URL[] urls = new URL[]{url}; 

    // Create a new class loader with the directory 
    ClassLoader cl = new URLClassLoader(urls); 

    // Load in the class; MyClass.class should be located in 
    // the directory file:/c:/myclasses/com/mycompany 
    Class cls = cl.loadClass("com.mycompany.MyClass"); 
} catch (MalformedURLException e) { 
} catch (ClassNotFoundException e) { 
} 
+0

Meine Frage war irgendwie unklar: Ich habe keine Klassen-Datei, sondern ein Byte-Array und möchte es direkt laden. Danke trotzdem! – theomega

+0

Fühlen Sie sich frei, Ihre Frage zu bearbeiten, um genauer zu sein. Der angegebene Code arbeitet mit Klassendateien auf der Festplatte. –

Verwandte Themen