2013-08-08 14 views
13

Ho due diverse classi di aspetto per contare il numero di chiamate al metodo non statiche per l'esecuzione di un programma di test. Il primo aspetto risiedono metodi su punti "call" join:esecuzione vs. chiamata Join point

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

mentre il secondo aspetto risiedono metodi su "esecuzione" join punti:

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

methodCallCounter() è un metodo statico della classe contatore.

Il numero di chiamate di metodo per il programma di test di piccole dimensioni è lo stesso. Ma quando cambio il programma di test con un programma più grande, il numero di chiamate di metodo nella seconda classe di aspetto (con punto di interruzione dell'esecuzione) è maggiore del numero di chiamate di metodo nella classe di aspetto con chiamata pointcut. Questo è ragionevole dal momento che il call join point non seleziona le chiamate fatte con super e quindi non le conteggia.

Tuttavia, ho riscontrato un caso in cui per l'esecuzione specifica del programma il numero di chiamate di metodi non statici nella classe di aspetto con "call pointcut" era superiore al numero di chiamate di metodo nella classe di aspetto con "esecuzione pointcut" . Non riesco a trovare alcuna interpretazione del perché ciò stia accadendo. Ogni pensiero sul motivo della seconda situazione è apprezzato.

+0

Non sono sicuro ... Consiglierei di stampare alcune informazioni sulle differenze. Forse stampare l'oggetto 'thisJoinPoint'. –

risposta

29

Acutally la spiegazione è abbastanza semplice se si comprende la differenza fondamentale tra call() e execution() pointcut: Mentre il primo intercetta tutti i chiamanti (cioè le fonti di chiamate di metodo), quest'ultimo intercetta le chiamate stesse non importa dove essi provengono da.

Quindi, come può variare il numero di intercettazioni attivate da entrambi i puntatori?

  • Se si chiama i metodi/JDK JRE dal proprio codice, AspectJ può tessere nelle vostre chiamate, ma non nelle joinpoint di esecuzione all'interno del JDK (a meno che non si è creato un JDK tessuto come fase preparatoria). Pertanto, il numero di chiamate sarà superiore al numero di esecuzioni.
  • Analogamente, se si richiamano metodi in librerie di terze parti che non si sono intessute con AspectJ perché non erano sul percorso in corso durante LTW o CTW, di nuovo le esecuzioni non verranno acquisite.
  • Ultimo ma non meno importante, può succedere il contrario se il proprio codice intrecciato viene chiamato da librerie di terze parti o da classi JRE/JDK. In questo caso il numero contato di esecuzioni sarà superiore al numero di chiamate perché provengono da luoghi al di fuori del controllo del tuo codice AspectJ.

Generalmente, in tutti i casi il motivo è la differenza tra il codice utilizzato complessivo e il sottoinsieme del codice tessuto. In altre parole: la differenza tra il codice al di sotto e al di là del tuo controllo (o degli aspetti).