2015-11-06 23 views
6

Ho una routine traccia AspectJ impostare fino a registrare le condizioni metodo di ingresso e di uscita utilizzando i seguenti pointcut:Come escludere un metodo interno anonimo da un collegamento di punti?

public aspect Trace {  
    pointcut anyMethodExecuted():  execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !within(is(AnonymousType)); 
    pointcut anyConstructorExecuted(): execution (biz.ianw.lanchecker.*.new(..)) && !within(Trace); 

Nella mia classe sendEmail Ho un metodo che chiama il metodo setDebugOut per reindirizzare l'output di debug a un LogOutputStream :

final private static Logger log = LoggerFactory.getLogger(MailMail.class); 
... 
LogOutputStream losStdOut = new LogOutputStream() {    
    @Override 
    protected void processLine(String line, int level) { 
     log.debug(line); 
    } 
};  

public void sendPlainHtmlMessage(...) { 
    Session session = javaMailSender.getSession(); 
    PrintStream printStreamLOS = new PrintStream(losStdOut); 
    session.setDebugOut(printStreamLOS); 
    ... 

Questo funziona bene, tranne che il pointcut classe traccia intercetta la chiamata classe interna anonima, producendo in uscita:

20:14:18.908 TRACE [biz.ianw.lanchecker.Trace] - Enters method: Logger biz.ianw.lanchecker.MailMail.access$0() 
20:14:18.909 TRACE [biz.ianw.lanchecker.Trace] - Exits method: Logger biz.ianw.lanchecker.MailMail.access$0(). 
20:14:18.909 TRACE [biz.ianw.lanchecker.Trace] - with return value: Logger[biz.ianw.lanchecker.MailMail] 
20:14:18.909 DEBUG [biz.ianw.lanchecker.MailMail] - DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle] 

ho aggiunto piuttosto troppo ampia condizione

&& !within(is(AnonymousType)) 

al pointcut, come indicato sopra, ma non ha avuto alcun effetto. In effetti sto avendo difficoltà a trovare (AnonymousType) documentato ovunque.

Come posso scrivere un collegamento di punti che esclude questo metodo interno anonimo, preferibilmente senza influire sugli altri?

+0

Non so se questo è correlato? 'joinPoint.getStaticPart(). getSignature(). getDeclaringType(). isAnonymousClass()' restituisce 'False' per' ... accesso $ 0() '. 'toLongString()' mostra la firma del metodo come: 'execution (static org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0())' – Ian

risposta

3

Questa risposta è per gentile concessione di Andrew Clement (vedi http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg14906.html, ff), ripubblicato qui con il suo permesso:

L'accesso $ 0 metodo è stato aggiunto alla MailMail perché registro è privata in MailMail - permette al log.debug (line) per accedere al log dalla classe anonima (presumibilmente chiamata MailMail $ 1).

Riconoscendo che, possiamo vedere che l'accesso $ 0 non è nella classe anonima, è un accessor generato nella classe MailMail, quindi il vostro frammento pointcut aggiuntivo non funziona.

paio di opzioni:

Escludere in modo specifico:

pointcut anyMethodExecuted():  execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !execution(* MailMail.access$0(..)); 

escludere tutte le funzioni di accesso di sintesi (si considera sintetica perché è 'generato' dal compilatore per sostenere quello che stai facendo):

pointcut anyMethodExecuted():  execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !execution(synthetic * access$*(..)); 

Oppure si potrebbe escludere tutti i materiali sintetici forse:

pointcut anyMethodExecuted():  execution (!synthetic * biz.ianw.lanchecker.*.*(..)) && !within(Trace);