2010-07-04 16 views
7

Ho ricevuto qualche codice java-byte (così compilato java-source) che viene generato nel mio programma. Ora voglio caricare questo codice byte nel Java-VM attualmente in esecuzione ed eseguire una funzione specifica. Non sono sicuro di come farlo, ho scavato un po 'nei Java Classloader ma non ho trovato una via diritta.Caricamento del codice byte Java in Runtime

Ho trovato una soluzione che accetta un file di classe sul disco rigido, ma il bytecode che ho ottenuto è in una matrice di byte e non voglio scriverlo sul disco ma usarlo direttamente.

Grazie!

+0

penso che nell'ambito di questo collegamento si dovrebbe trovare quello che stai cercando: http: //tutorials.jenkov. com/java-reflection/dynamic-class-loading-reloading.html Guarda l'ultima sezione "ClassLoader Load/Reload Example". –

+0

La mia domanda era in qualche modo poco chiara: non ho un file di classe ma un array di byte e voglio caricarlo direttamente. Grazie comunque! – theomega

+0

E sono abbastanza sicuro che il mio link ha fornito esattamente questo. Almeno ho trovato questo attraverso di esso: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html#defineClass (byte [], int, int) Inoltre è possibile ovviamente, salva sempre il tuo array di byte in una directory temporanea. –

risposta

9

è necessario scrivere un class loader personalizzato che sovraccarica il metodo findClass

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

Grazie, sembra un modo per ottenere, ma non esiste un modo diretto senza scrivere un custode ClassLoader? – theomega

+0

almeno nessuno che ho trovato finora –

+0

Funziona molto bene, grazie! – theomega

2

Se il codice byte non è sul classpath del programma in esecuzione, è possibile utilizzare URLClassLoader. Da 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

La mia domanda era in qualche modo poco chiara: non ho un file di classe ma un array di byte e voglio caricarlo direttamente. Grazie comunque! – theomega

+0

Sentiti libero di modificare la tua domanda per essere più preciso. Il codice citato funziona con i file di classe sul disco rigido. –

Problemi correlati