2010-07-04 25 views
7

Obtuve un código java-byte (así compilado java-source) que se genera en mi programa. Ahora quiero cargar este código de bytes en la Java-VM actualmente en ejecución y ejecutar una función específica. No estoy seguro de cómo lograr esto, profundicé un poco en los cargadores de clases de Java, pero no encontré ninguna forma directa.Cargar Java-Byte-Code en Runtime

Encontré una solución que toma un archivo de clase en el disco duro, pero el bytecode que obtuve está en una matriz de bytes y no quiero escribirlo en el disco sino usarlo directamente en su lugar.

Gracias!

+0

creo que en virtud de este enlace usted debe encontrar lo que busca: http: //tutorials.jenkov. com/java-reflection/dynamic-class-loading-reloading.html Consulte la última sección "Ejemplo de carga/recarga de ClassLoader". –

+0

Mi pregunta no estaba clara: no tengo un archivo de clase sino un array de bytes y quiero cargarlo directamente. ¡Gracias de cualquier manera! – theomega

+0

Y estoy bastante seguro de que mi enlace proporcionó exactamente eso. Al menos encontré esto a través de él: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html#defineClass (byte [], int, int) También puedes obviamente, siempre guarde su matriz de bytes en un directorio temporal. –

Respuesta

9

que necesita para escribir un cargador de clases a medida que sobrecarga el método FindClass

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

Gracias, parece una forma de obtener, pero no hay forma directa sin escribir un ClassLoader de custon. – theomega

+0

al menos ninguno que he encontrado hasta ahora –

+0

Funciona muy bien, gracias! – theomega

2

Si el código de bytes no está en la ruta de clase del programa en ejecución, puede usar URLClassLoader. De 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

Mi pregunta no estaba clara: no tengo un archivo de clase sino una matriz de bytes y quiero cargarlo directamente. ¡Gracias de cualquier manera! – theomega

+0

No dude en editar su pregunta para ser más preciso. El código citado funciona con archivos de clase en el disco duro. –