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?
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