2011-06-28 14 views
6

Quiero crear un punto de corte para dirigir una llamada a un método desde métodos específicos.aspectoJ corte de punto a método de llamada en métodos específicos

tomar el siguiente:

class Parent { 
    public foo() { 
    //do something 
    } 
} 

class Child extends Parent { 
    public bar1() { 
    foo(); 
    } 
    public bar2() { 
    foo(); 
    } 
    public bar3() { 
    foo(); 
    } 
} 

me gustaría tener un punto de corte en la llamada a foo() en los métodos Bar1() y bar3()

que estaba pensando algo así como

pointcut fooOperation(): call(public void Parent.foo() && (execution(* Child.bar1()) || execution(* Child.bar3())); 

before() : fooOperation() { 
    //do something else 
} 

Sin embargo, eso no parece funcionar. ¿algunas ideas?

gracias

Respuesta

2

Piense lo que quiere es en vez de hacer las cláusulas de ejecución (que tienen el inconveniente añadido de que requieren adiciones para cada nueva persona que llama), es el uso de destino, por ejemplo, algo así como:

target(Child) && call(public void Parent.foo()). 

Sorprendentemente, he encontrado las guías de punto en la documentación del eclipse bastante útiles. Ellos son here.

+0

yo diría que éste también se correspondería con la llamada a 'foo()' en 'bar2()', al contrario de la intención? – ShiDoiSi

+0

sí, eso captaría el 'foo()' en 'bar2()', que no es lo que se pretende – kabal

+0

Haha. Aquí hay una recomendación: si quiere capturar foo() desde bar2..barn, use mi punto de corte e ignore la llamada a foo desde bar1. Entrar y cambiar esa definición cada vez que se agrega una nueva barra no es muy bueno. – Rob

3

Tal withincode funcionará:

call(public void Parent.foo()) && (withincode(* Child.bar1()) || withincode(* Child.bar3())); 

Alternativamente puede probar con el punto de corte cflow:

pointcut bar1(): call(* Child.bar1()); 
pointcut bar3(): call(* Child.bar3()); 

call(public void Parent.foo()) && (cflow(bar1()) || cflow(bar3()); 

Mire aquí para una pointcut reference

Cuestiones relacionadas