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