2011-09-04 13 views

Respuesta

32

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

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

Spring Frameworkuses Proxies to implement its AOP support, que entre otras cosas potencia su soporte para transacciones declarativas. También utiliza proxies para aplicar un alcance adecuado.

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

CDI implementaciones deben también proxy de los granos de manejo para garantizar la correcta determinación del alcance. Sospecho que también usan una biblioteca de ingeniería de código de bytes.

I recientemente usamos Javassist para implementar una memoria caché transparente para los valores de retorno del método, interceptando todas las invocaciones de métodos y solo delegando 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 el proxying de clases.

14

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

He usado bytecode la manipulación para hacer algunos análisis de 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 bytecode para insertar una declaración System.out.println("method_name"); al principio de un método. Entonces, durante el tiempo de ejecución, imprimirá qué métodos se han invocado.

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

+1

Acerca de proyectos reales: sé que playFramework usó Javaassist. En este caso, tenemos el código fuente ... Y yo, probé, que Hibernate también usa javassist. – user471011

+1

Bien dicho ausgoo. –

0

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

Cuestiones relacionadas