¿Qué biblioteca / programa se puede usar para generar código de bytes Java? [cerrado]

StackOverflow https://stackoverflow.com/questions/291492

  •  08-07-2019
  •  | 
  •  

Pregunta

Sé sobre BCEL , pero este proyecto parece estar muerto, ya que no tenía lanzamientos para dos años. Y el mundo Java sigue adelante. 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 ensamblador de código de bytes.

¿Qué software me puede recomendar? ¿Es fácil de usar también? tiene buenos ejemplos / tutoriales?

EDITAR: Para todos los que preguntan: Sí, el javac está bien. Pero para generar algunas clases en tiempo de ejecución, una ruta directamente al código de bytes sería más limpia.

¿Fue útil?

Solución

ASM

http://asm.objectweb.org/

Es mucho más rápido que BCEL y admite genéricos y anotaciones. Un punto sobre su arquitectura: para garantizar un alto rendimiento, ASM se construye alrededor de un analizador que genera eventos (en contraste con 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 visitados está construida perezosamente por el analizador, por lo que si no está interesado en ciertas partes del archivo de clase ( por ejemplo, si desea conocer 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 describen completamente el método.

Otros consejos

Hay un ejemplo bastante completo del uso de ASM para generar código de bytes desde 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 originalmente usaba BCEL pero cambió a ASM porque ASM era significativamente más rápido (probablemente un orden de magnitud), y de manera igualmente significativa, ASM es seguro para subprocesos, por lo que es posible una compilación concurrente, que es necesaria para CAL.

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

http://serp.sourceforge.net/ es una gran biblioteca para una mayor abstracción al editar el bytecode.

Hay tecnologías como asm y cglib pero recomiendo Javaassist porque es una muy buena biblioteca para eso y puedes encontrar ejemplos en tapestry5 framework.

Creo que mi creador de código de bytes java favorito se llama javac y puede encontrarlo en www.sun.com

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

[En serio. ¿Qué te impide tomar tu fuente, hacer Java y compilarlo?]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top