2015-11-06 11 views
6

私は、次のポイントカットを使用してメソッドの入り口と出口の条件をログに記録するように設定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)を見つけるのが難しいです。

この匿名の内部メソッドを除外するポイントカットを、できれば他のものに影響を与えることなく、どのように書くことができますか?

+0

これが関連しているかどうかわかりませんか? 'joinPoint.getStaticPart()。getSignature()。getDeclaringType()。isAnonymousClass()'は '$ 0()'に対して 'False'を返します。 'toLongString()'は、メソッドのシグネチャを次のように表示します: 'execute(static org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0())' – Ian

答えて

3

この答えは礼儀アンドリュー・クレメント(http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg14906.htmlを参照してください、FF)、彼の許可を得てここに転載です:

ログがMailMailにプライベートであるため、アクセス$ 0メソッドがMailMailに追加されました - それは(log.debugを可能にします匿名クラス(おそらくMailMail $ 1と呼ばれる)からのログにアクセスするために使用します。

アクセス権$ 0が匿名クラスにないことがわかりました。これはMailMailクラスで生成されたアクセッサなので、追加のポイントカットフラグメントは機能しません。オプションの

カップル:

は、特にそれを除外:

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

はすべて合成アクセサを(それはコンパイラによって「生成」されているので、あなたが何をしているかをサポートするために、合成と考えられている)を除外

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

またはあなたはおそらく、すべての合成繊維除外する可能性:

pointcut anyMethodExecuted():  execution (!synthetic * biz.ianw.lanchecker.*.*(..)) && !within(Trace); 
関連する問題