2015-11-06 7 views
6

Ich habe eine AspectJ Trace-Routine der folgenden pointcuts loggen Methode Eintritts- und Austrittsbedingungen aufgebauter:Wie man eine anonyme innere Methode von einem Pointcut ausschließt?

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

In meiner sendemail-Klasse habe ich eine Methode, die die setDebugOut Methode ruft die Debug-Ausgabe auf einen LogOutputStream zu umleiten :

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); 
    ... 

Dies funktioniert außer in Ordnung, dass die Trace-Klasse pointcut fängt die die anonyme innere Klasse den Anruf, als Ausgabe erzeugt:

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] 

Ich fügte hinzu, die eher zu weit gefassten

&& !within(is(AnonymousType)) 

Zustand zum pointcut, wie oben gezeigt, aber es hatte keine Wirkung. In der Tat habe ich wirklich Schwierigkeiten zu finden ist (AnonymousType) überall dokumentiert.

Wie kann ich einen Pointcut schreiben, der diese anonyme innere Methode ausschließt, vorzugsweise ohne andere zu beeinflussen?

+0

Wissen Sie nicht, ob das verwandt ist? 'joinPoint.getStaticPart(). getSignature(). getDeclaringType(). isAnonymousClass()' gibt 'False' für' ... access $ 0() 'zurück. 'toLongString()' zeigt die Methodensignatur als: 'execution (static org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0())' – Ian

Antwort

3

Diese Antwort ist mit freundlicher Genehmigung Andrew Clement (siehe http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg14906.html, ff), reposted hier mit seiner Erlaubnis:

Der Zugang $ 0 Methode MailMail hinzugefügt wurde, weil log in MailMail privat ist - es ermöglicht die log.debug (Zeile), um auf das Protokoll von der anonymen Klasse (vermutlich MailMail $ 1 genannt) zuzugreifen.

Das erkennen wir, dass Zugriff $ 0 nicht in der anonymen Klasse ist, es ist ein Accessor, der in der MailMail-Klasse generiert wird, daher funktioniert Ihr zusätzliches Pointcut-Fragment nicht.

paar Optionen:

es speziell ausschließen:

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

Ausschließen aller synthetischen Accessoren (es synthetische betrachtet, weil es durch den Compiler ‚erzeugt‘ wird, zu unterstützen, was Sie tun):

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

Oder Sie könnten alle Kunststoffe ausschließen vielleicht:

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