2012-03-07 16 views
8

मैं एक जावा प्रोग्राम लिखने के लिए ऐसी है कि एक MethodA() बुला के बाद, पहले एक विधि methodBeforeA() कहा जाता है नामित कोशिश कर रहा हूँ के बाद एक विधि भागो और फिर MethodA () नामित किया जाता है जिसके बाद नाम दिया जाता है, methodAfterA()। यह जूनिट एनोटेशन का उपयोग करने के समान ही है (@Before, @Test, @After का उपयोग करके), इसलिए मुझे लगता है कि प्रतिबिंब का उपयोग करना संभव होना चाहिए लेकिन मेरे पास बहुत अच्छा सुराग नहीं है।से पहले और जावा में एक कहा जाता विधि

उत्तर

5

AspectJ आपको विधि प्रविष्टि से पहले और विधि से बाहर निकलने के बाद कटपॉइंट निर्दिष्ट करने की अनुमति देता है।

http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html

AspectJ में, pointcuts कार्यक्रम के प्रवाह में कुछ में शामिल होने के अंक बाहर लेने। उदाहरण के लिए, pointcut

call(void Point.setX(int)) 

की पसंद बाहर प्रत्येक बिंदु एक विधि हस्ताक्षर शून्य Point.setX(int) है कि के लिए एक कॉल है कि में शामिल होने के - वह यह है कि Point के void setX एक भी int पैरामीटर के साथ विधि।

+0

ईमानदार प्रश्न: क्या एस्पेक्टजे सलाह अभी भी निष्पादित करती है जब लक्ष्य विधि को प्रतिबिंब के माध्यम से बुलाया जाता है? –

+0

@AlistairIsrael, http://www.eclipse.org/aspectj/doc/released/faq.php#q:reflectiveCalls हमेशा नहीं सुझाता है। –

+0

सही दिशा में मुझे इंगित करने के लिए धन्यवाद .. इस ब्लॉगपोस्ट में आया और यह वही देता है जो मैं ढूंढ रहा था .. http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/ – Vanp

3

अन्य तरीकों से कॉल डालने के लिए विधि कोड को संशोधित करने की आवश्यकता होगी। जावा प्रतिबिंब आपको बहुत सी चीजें करने देता है, लेकिन यह आपको विधि कोड को गतिशील रूप से संशोधित नहीं करने देता है।

जो जुनीट करता है वह अलग है। यह प्रत्येक विधि @Before उसकी व्याख्या, @Test, और @After की पहचान करता है, तो की तर्ज पर कुछ करता है:

for (Method t : testMethods) { 
    for (Method b : beforeMethods) 
     b.invoke(); 
    t.invoke(); 
    for (Method a : afterMethods) 
     a.invoke(); 
} 

आप निश्चित रूप से कुछ इस तरह कर सकते हैं, सुनिश्चित करें कि आप फोन बनाने के लिए "पहले" और बाद तरीकों "के बाद" हर बार आप प्रश्न में विधि को कॉल करें। लेकिन आप सभी कॉलर्स को ऐसा करने के लिए मजबूर नहीं कर सकते हैं।

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