2010-04-23 13 views
7

¿Qué usos legítimos hay para la manipulación de bytecode y cómo las personas implementan esas soluciones basadas en la manipulación de códigos de byte en la práctica?Patrones de manipulación de códigos de bytes

Actualización: Debería haber dejado más claro que esta pregunta realmente es sobre qué patrones y técnicas utilizan las personas para hacer que su código vuele con la ayuda de la manipulación de bytecode.

Algo así como la programación orientada a aspectos que ya se mencionó o la creación de objetos proxy sobre la marcha y técnicas similares.

Respuesta

8

manipulación Bytecode le permite implementar arbitrariamente complejas (e interesantes) transformaciones del programa, tales como: Código/registro de salida

  • entrada para las funciones seleccionadas
  • transformaciones de seguridad que apagar el acceso a determinados API de
  • Sustitución de API para, p. Ej., Ejecutar código en un arnés de prueba.

El alcance es infinito; esto es solo una pequeña muestra.

En cuanto a cómo se hace normalmente, comience here.

+0

Tal vez debería haber sido más claro en esto. Ya conozco esas bibliotecas y sé cómo funciona Java en el nivel de bytecode. Lo que realmente quiero saber es qué geniales técnicas inventaron las personas para hacer cosas que de otro modo no podrían hacer, así que tengo en mente esas soluciones cada vez que me tropiezo con tales problemas. – ahe

4

Entonces, uno puede leer bytecode para implementar un intérprete/JVM. Se puede escribir/generar bytecode cuando se implementa un compilador de Java o un compilador para otro idioma que se dirigirá a la JVM (por ejemplo, Scala y Jython). Puede realizar una manipulación de bytecode para optimizar bytecode (si desea producir y comercializar un optimizador de bytecode o si lo necesita como una herramienta interna para dar al código de su empresa una ventaja sobre la competencia). En una línea similar, puede manipular bytecode para ofuscarlo antes de la distribución. También puede realizar la manipulación de bytecode para aspect-oriented programming; por ejemplo, es posible que desee insertar ganchos (tal vez para fines de cronometraje o de registro o por alguna otra razón), y si fuera más simple o menos costoso manipular el bytecode que editar todos los archivos fuente (como podría ser el caso si el código fuente no está disponible o proviene de muchas fuentes diferentes, no todas pueden estar bajo el control de uno o para las cuales puede ser costoso y lleva mucho tiempo convencer a esos equipos para que agreguen dichos ganchos), este podría ser un caso en el que haría Tiene sentido insertar las modificaciones a la salida final del bytecode en lugar de intentar modificar el código original (lo que puede requerir la subida o el mantenimiento de una bifurcación por separado, o la compra del código fuente de un tercero que suministra solo el bytecode).

Puede manipular bytecode usted mismo, aunque existen muchas bibliotecas y marcos de código abierto para hacerlo, incluidos BCEL y ASM, por nombrar solo un par.

+0

"sería menos costoso manipular el bytecode de lo que sería editar todos los archivos fuente" - ¿Cómo es eso? – kgdinesh

+1

@DineshBabu reformulado, proporcionó algunos ejemplos para aclarar –

+0

Gracias, pero ¿cómo se produce la manipulación del código de bytes como un patrón de diseño? Si salimos del ámbito de Java y hablamos en lenguajes de programación en general, no todos tienen esta característica. ¿Cómo hacen las cosas? – kgdinesh

3

Hay papeles Patterns of Aspect-Oriented Design (PDF) y Aspect-Oriented Design Principles: Lessons from Object-Oriented Design (PDF) que describen algunos patrones para la manipulación de AOP/bytecode.

Personalmente he utilizado la manipulación de bytecode con ASM en one framework para generar un código repetitivo para las clases que usan ese marco. El marco requiere métodos custom equals() y hashCode() para el código del cliente, por lo que I generate those conectando un Java Agent que modifica el bytecode cuando el ClassLoader carga las clases.También he usado muchas veces CGLIB para producir proxies dinámicos (si eso cuenta como AOP).

0

Algunos marcos como BEA KODO (implementación de la especificación de objetos de datos de Java) utilizan la manipulación de bytecode para "mejorar" objetos antiguos de Java simple y agregar la lógica de persistencia, basada en una descripción XML.

Por lo tanto, la información de mapeo de la base de datos se genera automáticamente en el bytecode.

Cuestiones relacionadas