2011-06-28 9 views
6

मैं विशिष्ट तरीकों से किसी विधि को कॉल को लक्षित करने के लिए पॉइंटकट बनाना चाहता हूं।विशिष्ट तरीकों में विधि कॉल के लिए AspectJ पॉइंटकट

ले निम्नलिखित:

class Parent { 
    public foo() { 
    //do something 
    } 
} 

class Child extends Parent { 
    public bar1() { 
    foo(); 
    } 
    public bar2() { 
    foo(); 
    } 
    public bar3() { 
    foo(); 
    } 
} 

मैं foo के लिए कॉल पर एक बिंदु में कटौती करना चाहते हैं() पद्धतियों bar1 में() और bar3()

मैं

की तरह कुछ सोच रहा था
pointcut fooOperation(): call(public void Parent.foo() && (execution(* Child.bar1()) || execution(* Child.bar3())); 

before() : fooOperation() { 
    //do something else 
} 

हालांकि, यह काम नहीं लगता है। कोई विचार?

धन्यवाद

उत्तर

2

लगता है कि तुम क्या चाहते हैं, उदाहरण के बजाय निष्पादन खंड (जो एक नया फोन करने वाले के लिए अतिरिक्त की आवश्यकता होती है के अतिरिक्त नुकसान है), लक्ष्य का उपयोग है ऐसा करने का है कुछ ऐसा:

target(Child) && call(public void Parent.foo()). 

कुछ हद तक आश्चर्यजनक रूप से, मुझे ग्रहण प्रलेखन में पॉइंटकट मार्गदर्शिका काफी उपयोगी मिली है। वे here हैं।

+0

के लिए यहाँ देखो मैं कहता हूँ कि हम इस एक भी कॉल से मेल होगा:

call(public void Parent.foo()) && (withincode(* Child.bar1()) || withincode(* Child.bar3())); 

वैकल्पिक रूप से आप cflow pointcut की कोशिश कर सकते 'bar2()' में 'foo()' के लिए, इरादे के विपरीत? – ShiDoiSi

+0

हां, जो 'bar2()' में 'foo() 'को पकड़ लेगा, जो कि – kabal

+0

हाहा का इरादा नहीं है। यहां एक अनुशंसा है: यदि आप bar2..barn से foo() को कैप्चर करना चाहते हैं, तो मेरे पॉइंट कट का उपयोग करें और बार 1 से foo को कॉल को अनदेखा करें। प्रत्येक बार जब एक नई बार जोड़ दी जाती है तो उस परिभाषा में आना और बदलना बहुत ही अच्छा नहीं है। – Rob

3

शायद withincode काम करेगा:

pointcut bar1(): call(* Child.bar1()); 
pointcut bar3(): call(* Child.bar3()); 

call(public void Parent.foo()) && (cflow(bar1()) || cflow(bar3()); 

एक pointcut reference

संबंधित मुद्दे