tabla que interprete extension estructura ejemplos cursos codigo java jvm bytecode

interprete - que es jvm en java



¿Qué biblioteca/programa se puede usar para generar Java-bytecode? (7)

¿Por qué no usar el compilador de Java, javac? ¿Qué hay de malo en usarlo para generar código de byte JVM?

[Seriamente. ¿Qué le impide tomar su fuente, hacer Java y compilarlo?]

Sé de BCEL , pero este proyecto parece estar muerto, ya que no tenía lanzamientos en dos años. Y el mundo de Java avanza. Por ejemplo, JDK 1.6 tiene un nuevo formato de archivo de clase.

Entonces, qué biblioteca se puede usar para crear bytecode para la JVM. Si no hay biblioteca, un programa también está bien, si puedo manipular el código generado en detalle, por ejemplo un bytecode-assembler.

¿Qué software puedes recomendar? ¿Es fácil usarlo también? tiene buenos ejemplos / tutoriales?

EDITAR: Para todos: Sí, el javac está bien. Pero para generar algunas clases en tiempo de ejecución, una ruta directa a bytecode sería más clara.


ASM

http://asm.objectweb.org/

Es mucho más rápido que BCEL y admite genéricos y anotaciones. Un punto acerca de su arquitectura: para garantizar un alto rendimiento, ASM se basa en un analizador sintáctico que genera eventos (a diferencia de BCEL, donde el analizador construye una estructura de datos). Esto es algo similar a la diferencia entre los analizadores SAX y DOM. Se necesita algo de práctica para acostumbrarse a este tipo de pensamiento.

EDITAR (siguiendo el comentario de McDowell): De hecho, los visitantes son muy utilizados en ASM, pero es más que simples visitantes: la estructura de datos visitada está construida de forma perezosa por el analizador sintáctico, por lo que si no está interesado en ciertas partes del archivo class (por ejemplo, desea saber los nombres de los métodos pero no le importa su cuerpo), puede devolver un valor nulo del método visitMethod (). Esto hará que el analizador omita las secciones del cuerpo del método, evitando así la construcción (costosa) de la red de objetos que describa completamente el método.


Creo que mi creador de bytecode favorito de Java se llama javac y puedes encontrarlo en www.sun.com


Existen tecnologías como asm y cglib, pero recomiendo Javaassist porque es una biblioteca muy buena para eso y puedes encontrar ejemplos en el marco de tapices5 .


Hay un ejemplo bastante completo de uso de ASM para generar código de bytes a partir de un lenguaje intermedio similar a Java en la implementación de CAL (un lenguaje similar a Haskell para la JVM). Si descarga las fuentes en http://openquark.org/Open_Quark/Download.html, entonces puede encontrar el código en AsmJavaByteCodeGenerator.java, y las clases de modelo java en la misma carpeta. El código generado es básicamente lo que haría javac, menos las anotaciones de depuración.

La implementación de CAL utilizó originalmente BCEL pero cambió a ASM porque ASM fue significativamente más rápido (probablemente un orden de magnitud), e igualmente significativo, ASM es seguro para subprocesos, por lo que es posible la compilación simultánea, que CAL necesita.



Javassist y cglib son dos buenas bibliotecas de ingeniería de bytecode. Se usan ampliamente en el mundo de Java EE para generar proxies de objetos en tiempo de ejecución. Hibernate y Spring son dos marcos principales que hacen uso de estas bibliotecas.