2015-11-06 9 views
6

मैं एक AspectJ दिनचर्या का पता लगाने निम्नलिखित pointcuts का उपयोग कर विधि प्रवेश और निकास की स्थिति लॉग इन करने की स्थापना की है:पॉइंटकट से अज्ञात आंतरिक विधि को कैसे बाहर निकालना है?

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

मेरी sendEmail वर्ग में मैं एक तरीका है जिसके एक LogOutputStream को डिबग आउटपुट पुनर्निर्देशित करने के लिए setDebugOut प्रणाली को बुलाती है :

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

यह ठीक काम करता है, को छोड़कर ट्रेस वर्ग pointcut कॉल गुमनाम आंतरिक वर्ग को बीच में रोक कि, आउटपुट के रूप में उत्पादन:

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] 

मैं के रूप में ऊपर दिखाए गए, pointcut को नहीं बल्कि बहुत व्यापक

&& !within(is(AnonymousType)) 

शर्त का जोड़ा, लेकिन यह कोई प्रभाव नहीं पड़ा। असल में मुझे वास्तविक कठिनाई मिल रही है (अनामित टाइप) कहीं भी दस्तावेज है।

मैं एक पॉइंटकट कैसे लिख सकता हूं जो इस अज्ञात आंतरिक विधि को छोड़ देता है, अधिमानतः किसी अन्य को प्रभावित किए बिना? यह log.debug सक्षम बनाता है (-

पहुँच $ 0 विधि MailMail में जोड़ा गया है क्योंकि लॉग MailMail में निजी है:

+0

पता नहीं है कि यह संबंधित है या नहीं? 'joinPoint.getStaticPart()। getSignature()। getDeclaringType()। isonymous क्लास()' 'के लिए' गलत 'रिटर्न' ... $ 0() 'एक्सेस करें। 'toLongString() 'विधि हस्ताक्षर को इस प्रकार दिखाता है:' निष्पादन (स्थिर org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0()) ' – Ian

उत्तर

3

इस उत्तर शिष्टाचार एंड्रयू क्लेमेंट (http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg14906.html देखते हैं, एफएफ), उसकी अनुमति के साथ यहाँ फिर से पोस्ट किया है लाइन) अज्ञात वर्ग से लॉग का उपयोग करने के लिए (संभवतः मेलमेल $ 1 कहा जाता है)।

यह स्वीकार करते हुए, हम देख सकते हैं कि $ 0 का उपयोग अज्ञात वर्ग में नहीं है, यह मेलमेल क्लास में उत्पन्न एक एक्सेसर है, इसलिए आपका अतिरिक्त पॉइंटकट खंड काम नहीं कर रहा है।

विकल्पों में से युगल:

यह विशेष रूप से शामिल न करें:

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

सभी सिंथेटिक accessors बहिष्कृत करें (यह सिंथेटिक क्योंकि यह तुम क्या कर रहे समर्थन करने के लिए संकलक द्वारा 'उत्पन्न' है माना जाता है):

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

या आप शायद सभी सिंथेटिक्स बाहर कर सकते हैं:

pointcut anyMethodExecuted():  execution (!synthetic * biz.ianw.lanchecker.*.*(..)) && !within(Trace); 
संबंधित मुद्दे