2011-09-08 4 views
6

के निम्न पहलू की कल्पना करते हैं:क्या AspectJ के साथ एक विधि कॉल करने वाले ऑब्जेक्ट उदाहरण को पुनर्प्राप्त करना संभव है?

aspect FaultHandler { 

    pointcut services(Server s): target(s) && call(public * *(..)); 

    before(Server s): services(s) { 
    // How to retrieve the calling object instance? 
    if (s.disabled) ...; 
    } 

} 

pointcut Server की सार्वजनिक तरीकों के लिए सभी कॉल कब्जा और before सलाह बस से पहले इनमें से किसी भी कहा जाता है चलाता है।

before सलाह में सार्वजनिक Server विधि को कॉल करने वाले ऑब्जेक्ट इंस्टेंस को पुनर्प्राप्त करना संभव है? यदि हां, तो कैसे?

उत्तर

4

आप इस() pointcut उपयोग कर सकते हैं: जाहिर है

pointcut services(Server s, Object o) : target(s) && this(o) && call.... 

, आप वस्तु के बजाय एक विशिष्ट प्रकार यदि आप इसे गुंजाइश की जरूरत का उपयोग कर सकते हैं।

संपादित

तुम भी thisJoinPoint चर का उपयोग कर सकते हैं:

Object o = thisJoinPoint.getThis(); 

जबकि का उपयोग कर thisJoinPoint अक्सर विशिष्ट pointcuts उपयोग की तुलना में एक छोटे से प्रदर्शन दंड में उठाना है, यह मामले में इस्तेमाल किया जा सकता फोन करने वाले एक है स्थैतिक वर्ग

उस स्थिति में, कोई "यह" नहीं है, इसलिए यह (ओ) मिलान करने में विफल हो सकता है, और यहJoinPoint.getThis() वापस शून्य।

हालांकि

, का उपयोग करते हुए:

Class c = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType(); 

आप वर्ग है कि स्थिर विधि शामिल बता देंगे। हस्ताक्षर पर अधिक फ़ील्ड की खोज करने से आपको विधि का नाम भी मिल सकता है ..

+0

तो 'ओ' निश्चित रूप से मेरी विधि का कॉलर होगा? भले ही सर्वर विधि स्थिर कोड से कहा जाता है? – JVerstry

+1

@ जेवीरस्ट्री: [प्रलेखन] (http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html) कहता है कि 'यह' पॉइंटकट "स्थिर संदर्भों से किसी भी शामिल बिंदु से मेल नहीं खाएगा । " –

+0

मुझे लगता है कि प्रलेखन का अर्थ है "एक स्थिर विधि निष्पादन के मामले में, ऐसा कोई नहीं है, इसलिए इसे इस()" का उपयोग करके कैप्चर नहीं किया जा सकता है। –