java bytecode javassist

Javassista ¿Cuál es la idea principal y dónde se usa realmente?



bytecode (4)

Sé que Javassist es una biblioteca Java que proporciona un medio para manipular el bytecode Java de una aplicación.

Ok, pero ¿por qué necesitamos manipular el código de bytes?

¿Algún ejemplo real? Cualquier aplicación real, donde javassist utiliza?


La manipulación del código de bytes es útil y necesaria, especialmente cuando no tiene código fuente para ciertos proyectos. Digamos que solo tiene el bytecode (como un archivo jar) para algún proyecto, pero que de alguna manera desea cambiar el comportamiento del código, la biblioteca de manipulación de bytecode puede ayudar en tales casos. La ventaja de la manipulación de bytecode es que no necesita volver a compilar su código y puede ejecutarlo directamente después de la manipulación.

He utilizado la manipulación de código de bytes para hacer un análisis del programa. Dada una biblioteca, quiero saber durante el tiempo de ejecución qué métodos de la biblioteca se han invocado. Puedo usar la manipulación de System.out.println("method_name"); para insertar un System.out.println("method_name"); Declaración al principio de un método. Así que durante el tiempo de ejecución, se imprimirá qué métodos se han invocado.

Algunas bibliotecas de manipulación de código de bytes son:


La página de usuarios del proyecto ASM enumera varias docenas de proyectos y marcos de Java ampliamente utilizados que utilizan ASM para el análisis y la manipulación del código de bytes. http://asm.ow2.org/users.html



Una aplicación común es generar clases proxy en tiempo de ejecución, es decir, crear una subclase en tiempo de ejecución que intercepte todas las invocaciones de métodos. Ejemplos:

Hibernate usa Proxies para interceptar invocaciones de métodos en entidades para implementar la carga diferida, es decir, obtener el objeto de la base de datos cuando se accede por primera vez.

Spring Framework utiliza Proxies para implementar su soporte AOP , que entre otras cosas potencia su soporte para transacciones declarativas. También utiliza proxies para imponer el alcance adecuado.

EJB usa proxies para implementar transacciones administradas por contenedor, verificación de autorización y para aplicar interceptores definidos por el usuario.

Las implementaciones de CDI también deben representar a los beans administrados para garantizar el alcance adecuado. Sospecho que también usan una biblioteca de ingeniería de códigos de bytes.

Recientemente utilicé Javassist para implementar un caché transparente para los valores de retorno de métodos, al interceptar todas las invocaciones de métodos y solo delegar a la súper implementación en la primera invocación.

Tenga en cuenta que java.lang.reflect.Proxy puede generar clases de proxy en tiempo de ejecución, pero solo puede implementar interfaces, no extender una clase. Todos los casos de uso anteriores requieren la asignación de clases.