2010-11-23 10 views
7
ClassWriter cw = new ClassWriter(...); 
byte[] bytes = cw.toByteArray(); 

Me gustaría crear una nueva instancia de clase de bytes matriz. ¿Cómo hago esto? ¿Es posible?Java: nueva instancia de bytecode

+1

posible duplicado de [Java: cómo cargar la clase almacenada como byte \ [\] en la JVM?] (Http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored- as-byte-into-the-jvm) –

+0

@bruno conde: Parece. Simplemente expresamos las cosas de una manera más concisa aquí –

+0

Puede usar defineClass, sin embargo, a menos que use un cargador de clases personalizado, es posible que necesite usar reflexiones para llamarlo ya que no es un método público. –

Respuesta

8
+1

Buena respuesta pero horrible formato y un enlace java 1.4. Cambió ambos. –

+0

gracias por la edición, estaba luchando con eso, pero el analizador no quería mostrar el enlace correctamente. –

+3

+1. De todos modos, el método está protegido, por lo que necesitará una forma de acceder a él. Extender ClassLoader y proporcionar un método público podría ser una solución. –

2

Esto es posible, y hay que utilizar la reflexión con el fin de lograr este objetivo. El código de psuedo es:

final Class clazz = loadIntoCurrentClassLoader(bytes); //I'm assuming you wrote this already using defineClass 

final YourClass foo ; 
try { 
    foo = (YourClass) clazz.newInstance(); 
} 
catch (final Exception e) { 
    throw new RuntimeException(e); 
} 
+0

Estoy bastante seguro de que la pregunta es sobre la parte 'loadIntoCurrentClassLoader (bytes)' :-) –

+0

Ok, así que fui un poco por la borda;) –

+0

Es ambigua por la forma en que se formula la pregunta. –

0

Puedo crear la clase extendiendo ClassLoader y usando defineClass. Pero luego la clase creada tiene mi ClassLoader extendido como su ClassLoader, que causa fallas cuando el código de mi clase carga otras clases. Presumiblemente puedo evitar esto al crear mi ClassLoader para delegar todo de la manera correcta, pero no es obvio cómo hacerlo bien.

Cuestiones relacionadas