2015-11-06 55 views
6

Aşağıdaki pointcuts kullanarak yöntem giriş ve çıkış koşulları oturum için kurulmuş bir AspectJ iz rutini var:Anonim bir iç yöntemi bir noktadan nasıl hariç tutulur?

Benim SendEmail sınıfta
public aspect Trace {  
    pointcut anyMethodExecuted():  execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !within(is(AnonymousType)); 
    pointcut anyConstructorExecuted(): execution (biz.ianw.lanchecker.*.new(..)) && !within(Trace); 

Bir LogOutputStream için hata ayıklama çıktısını yönlendirmek için setDebugOut yöntemini çağıran bir yöntemi var :

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

Bu İz sınıf pointcut çıktı olarak üreten, çağrıyı anonim iç sınıf yakaladığını dışında çalışıyor yukarıda gösterildiği gibi

Ben pointcut oldukça fazla geniş kapsamlı

&& !within(is(AnonymousType)) 

koşulu eklendi, ancak hiçbir etkisi olmadı. Aslında, herhangi bir yerde belgelenmiş (AnonymousType) bulmakta zorluk çekiyorum.

Bu anonim iç yöntemi dışlayan, tercihen başkalarını etkilemeden nasıl bir nokta kesiti yazabilirim? o log.debug sağlayan (- log MailMail özel olduğu için

erişim $ 0 yöntem MailMail eklendi:

+0

Bu, ilgili bir sorun mu var? joinPoint.getStaticPart(). getSignature(). getDeclaringType(). isAnonymousClass() '' False' için döndürür ... ... $ 0() '. 'toLongString()' yöntem imzasını şu şekilde gösterir: 'execution (statik org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0())' – Ian

cevap

3

Bu cevap nezaket Andrew Clement, onun izni ile burada yayınlanırsa (ff, http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg14906.html bakınız) satır) anonim sınıftan (muhtemelen MailMail $ 1 olarak adlandırılır) günlük erişimi.

Bunu kabul ederek, $ 0'ın anonim sınıfta olmadığını, MailMail sınıfında oluşturulan bir erişimci olduğunu, dolayısıyla ek pointcut parçanızın çalışmadığını görebiliyoruz. seçeneklerden

Çift:

onu özellikle dışla:

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

(o ne yaptığını desteklemek için derleyici tarafından 'oluşturulan' çünkü sentetik olarak kabul edilir) Tüm sentetik erişimcileri dışla:

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

Yoksa belki de tüm sentetikler hariç tutabilirsiniz:

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