2015-11-06 15 views
6

Mam śledzenia rutyny AspectJ skonfigurować zalogować warunki wjazdu metoda i wyjścia za pomocą następujących punktów przekroju:Jak wykluczyć anonimową metodę wewnętrzną za pomocą cięcia punktowego?

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

W mojej klasie SendEmail mam metodę, która wywołuje metodę setDebugOut przekierować wyjście debugowania do 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); 
    ... 

działa to dobrze, poza tym, że klasa punktu przekroju Śledzenie przechwytuje rozmowę z anonimowym klasy wewnętrzna, wytwarzając jako wyjście:

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] 

I dodaje raczej zbyt szerokie

&& !within(is(AnonymousType)) 

warunek do punktu przekroju,, jak przedstawiono powyżej, ale nie miał żadnego wpływu. W rzeczywistości mam prawdziwy problem ze znalezieniem (AnonymousType) udokumentowaną gdziekolwiek.

Jak napisać skrót, który wyklucza tę anonimową metodę wewnętrzną, najlepiej bez wpływu na inne?

+0

Nie wiem, czy jest to powiązane? 'joinPoint.getStaticPart(). getSignature(). getDeclaringType(). isAnonymousClass()' zwraca 'False' dla' ... access $ 0() '. 'toLongString()' pokazuje podpis metody jako: 'wykonanie (static org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0())' – Ian

Odpowiedz

3

Ta odpowiedź jest dzięki uprzejmości Andrew Clement (patrz http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg14906.html, ff), zamieszczać tutaj za jego zgodą:

Dostęp $ 0 metoda została dodana do MailMail ponieważ jest prywatny dziennik w MailMail - umożliwia on log.debug (linia), aby uzyskać dostęp do dziennika z anonimowej klasy (prawdopodobnie nazywa się MailMail $ 1).

Uznając, że widzimy, że dostęp 0 USD nie znajduje się w klasie anonimowej, jest to akcesor wygenerowany w klasie MailMail, w związku z czym dodatkowy fragment punktu nie działa.

kilka opcji:

wykluczyć szczególności:

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

Wykluczenie wszystkich syntetycznych akcesorów (uważa się, syntetyczny, ponieważ jest „generowane” przez kompilator do wsparcia, co robisz):

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

Albo można wykluczyć wszelkie syntetyki być może:

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