2011-09-08 11 views
6

Imaginemos el siguiente aspecto:¿Es posible recuperar la instancia del objeto realizando una llamada a un método con AspectJ?

aspect FaultHandler { 

    pointcut services(Server s): target(s) && call(public * *(..)); 

    before(Server s): services(s) { 
    // How to retrieve the calling object instance? 
    if (s.disabled) ...; 
    } 

} 

El punto de corte captura todas las llamadas a métodos públicos de Server y dirige el consejo before justo antes de que cualquiera de estos son llamados.

¿Es posible recuperar la instancia del objeto que realiza la llamada al método público Server en el consejo before? Si es así, ¿cómo?

Respuesta

4

puede utilizar el presente() pointcut:

pointcut services(Server s, Object o) : target(s) && this(o) && call.... 

Obviamente, se puede utilizar un tipo específico de objeto en lugar de si es necesario que alcance.

EDITAR

También puede utilizar la variable thisJoinPoint:

Object o = thisJoinPoint.getThis(); 

Durante el uso de thisJoinPoint menudo incurren en una penalización de rendimiento pequeño en comparación con el uso de puntos de corte específicos, que puede ser utilizado en caso de que la persona que llama es una clase estática

En ese caso, no hay "esto", por lo que esto (o) puede no coincidir, y esteJoinPoint.getThis() devuelve nulo.

Sin embargo, usando:

Class c = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType(); 

le dirá la clase que contiene el método estático. Explorar más campos en la firma también puede darle el nombre del método, etc.

+0

¿Así que 'o' será quien llame mi método con seguridad? Incluso si el método del servidor se llama desde el código estático? – JVerstry

+1

@JVerstry: La [documentación] (http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html) indica que el 'punto de corte' "no coincidirá con ningún punto de unión de contextos estáticos " –

+0

Creo que la documentación significa que "en el caso de una ejecución de método estático, no existe esto, por lo que no se puede capturar utilizando this()". –

Cuestiones relacionadas