2011-06-28 16 views
6

Chcę utworzyć punkt przecięcia w celu wywołania wywołania metody z określonych metod.AspectJ pointcut do wywołania metody w konkretnych metodach

podjąć następujące:

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

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

chciałbym mieć punkt odcięcia na wezwanie do Foo() w metodach Bar1() i bar3()

Myślałam coś

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

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

Jednak to nie działa. jakieś pomysły?

dzięki

Odpowiedz

2

Myśl co chcesz, to zamiast robić klauzule wykonawcze (które mają dodatkową wadę, że wymaga uzupełnień dla każdego nowego rozmówcy), jest użycie cel, na przykład coś w rodzaju:

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

Nieco zaskakujące, znalazłem poradniki do cięcia punktów w dokumentacji zaćmienia bardzo przydatne. Są to: here.

+0

powiedziałbym ten będzie również pasować do połączenia do 'foo()' w 'bar2()', w przeciwieństwie do intencji? – ShiDoiSi

+0

tak, to by złapało 'foo()' w 'bar2()', co nie jest zgodne z zamierzonym – kabal

+0

Haha. Oto zalecenie: jeśli chcesz przechwycić foo() z bar2..barn, użyj mojego cięcia punktowego i zignoruj ​​wywołanie foo z bar1. Pojawianie się i zmiana tej definicji za każdym razem, gdy dodawany jest nowy pasek, nie jest zbyt bueno. – Rob

3

Może withincode zadziała:

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

Ewentualnie można spróbować cflow punkt przekroju:

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

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

Spójrz tutaj na pointcut reference

Powiązane problemy