私は、次のポイントカットを使用してメソッドの入り口と出口の条件をログに記録するように設定AspectJのトレースルーチン持っている:私はLogOutputStreamにデバッグ出力をリダイレクトするsetDebugOutメソッドを呼び出すメソッドを持っている私のsendEmailクラスで匿名の内部メソッドをポイントカットから除外する方法は?
public aspect Trace {
pointcut anyMethodExecuted(): execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !within(is(AnonymousType));
pointcut anyConstructorExecuted(): execution (biz.ianw.lanchecker.*.new(..)) && !within(Trace);
を:
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]
:
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);
...
これは、Traceクラスのポイントカットが出力として生成する、コール匿名内部クラスをインターセプトすることを除いて、正常に動作します
上記のように、私は、ポイントカットにかなり過度広い
&& !within(is(AnonymousType))
条件を追加し、それは効果がなかったです。実際、どこにも文書化されている(AnonymousType)を見つけるのが難しいです。
この匿名の内部メソッドを除外するポイントカットを、できれば他のものに影響を与えることなく、どのように書くことができますか?
これが関連しているかどうかわかりませんか? 'joinPoint.getStaticPart()。getSignature()。getDeclaringType()。isAnonymousClass()'は '$ 0()'に対して 'False'を返します。 'toLongString()'は、メソッドのシグネチャを次のように表示します: 'execute(static org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0())' – Ian