2011-11-25 6 views
7

¿Es posible escuchar la ejecución de un método de una instancia o todas las instancias de una clase, sin modificar su código? Algo así como:¿Hay alguna forma de escuchar la ejecución del método de otra clase?

someInstance.addMethodExecutionListener('methodName', handler); 
SomeClass.addMethodExecutionListener('methodName', handler); 

Sería para propósitos de registro ...

+0

Entonces, ¿qué es lo que quieres? ¿Necesita que se le notifique cada vez que la función 'methodName()' comienza a ejecutarse? –

+0

Exactamente, y sin modificar el código de clase. –

Respuesta

5

Lo que estamos pidiendo es sobre un pequeño subconjunto de lo que puede hacer con la programación orientada a aspectos. No es compatible con Java simple y sus implementaciones, pero es la razón central para AspectJ.

2

Según el entorno, puede usar diferentes tecnologías. Spring proporciona Aspects que puede vincular a ciertos eventos (por ejemplo, ejecución del método).

Si se encuentra en un entorno gestionado con contenedor de Java EE puede usar Interceptors para EJB o SoapHandlers para servicios web.

0

Un enfoque es utilizar la API de herramientas, JVMTI (reemplaza las API de depuración y de creación de perfiles por separado).

De lo contrario, podría volver a escribir los archivos de clase para insertar su código antes del código del método. No es necesariamente fácil. ASM es bueno para la manipulación de bytecode en un nivel bajo, pero es posible que desee utilizar alguna biblioteca (o escribir la suya) o posiblemente utilizar alguna herramienta de "aspecto".

Bytecode se puede reescribir fácilmente "en el disco" antes de cargarlo, o en tiempo de ejecución usando instrumentation API y -javaagent: en la línea de comandos.

Cuestiones relacionadas