2013-08-08 12 views
13

Mam dwie różne klasy aspektu, aby policzyć liczbę niestatycznych wywołań metod dla wykonania programu testowego. Pierwszy aspekt liczy metod na punkty „call” join:Vs wykonania. call Join point

pointcut methodCalls() : call (!static * test..*(..)); 
before(): methodCalls() { 
     counter.methodCallCounter(); 
} 

natomiast drugi aspekt liczy metod na „wykonanie” join punktów:

pointcut methodCalls() : execution (!static * test..*(..)); 
before(): methodCalls() { 
     counter.methodCallCounter(); 
} 

methodCallCounter() jest metodą statyczną w klasie licznika.

Liczba wywołań metod dla małego programu testowego jest taka sama. Ale kiedy zmieniam program testowy na większy program, liczba wywołań metod w drugiej klasie aspektu (z pointcutem wykonania) jest większa niż liczba wywołań metod w klasie aspektu z wycinkiem połączeń. Jest to uzasadnione, ponieważ punkt połączenia nie wybiera połączeń wykonanych z super i dlatego ich nie liczy.

Jednak spotkałem się z przypadkiem, w którym dla konkretnego wykonania programu liczba niestatycznych wywołań metod w klasie aspektu z "call pointcut" była wyższa niż liczba wywołań metod w klasie aspektu z "wykonanie pointcut" . Nie mogę znaleźć żadnej interpretacji, dlaczego tak się dzieje. Uważa się każdą myśl o przyczynie drugiej sytuacji.

+0

Nie jestem pewien ... Polecam wydrukowanie informacji o różnicach. Być może wydrukuj obiekt "thisJoinPoint". –

Odpowiedz

29

Acutally wyjaśnienie jest bardzo proste, jeśli zrozumieć podstawową różnicę między call() i execution() punktów przekroju: Podczas dawnych przechwytuje wszystkie dzwoniący (czyli źródła połączeń metody), to ostatnie przechwytuje same rozmowy bez względu na to skąd pochodzą od.

W jaki sposób może być różna liczba przechwyceń wywołanych przez oba punkty przekroju?

  • Jeśli zadzwonisz JRE metod/JDK z własnego kodu, AspectJ może wplatają połączeń, ale nie do joinpoints egzekucyjnym w ramach JDK (o ile nie zostały utworzone tkanego JDK jako etap przygotowawczy). Tak więc liczba połączeń będzie wyższa niż liczba wykonań.
  • Podobnie, jeśli wywołasz metody w bibliotekach stron trzecich, których nie utknąłeś w AspectJ, ponieważ nie były one w ścieżce podczas LTW lub CTW, ponownie wykonania nie zostaną przechwycone.
  • Wreszcie, może się zdarzyć na odwrót, jeśli twój własny kod tkany zostanie wywołany przez biblioteki stron trzecich lub przez klasy JRE/JDK. W takim przypadku zliczona liczba wykonań będzie wyższa niż liczba połączeń, ponieważ pochodzą one z miejsc poza kontrolą twojego kodu AspectJ.

Ogólnie, we wszystkich przypadkach powodem jest różnica między ogólnie używanym kodem a podzbiorem tkanego kodu. Innymi słowy: różnica między kodem pod i poza kontrolą (lub aspektami).