2013-08-08 6 views
13

में शामिल हों मेरे पास परीक्षण कार्यक्रम के निष्पादन के लिए गैर स्थैतिक विधि कॉल की संख्या की गणना करने के लिए दो अलग-अलग पहलू वर्ग हैं। पहला पहलू मायने रखता है पर "कहते हैं" में शामिल होने अंक तरीके:निष्पादन बनाम। कॉल प्वाइंट

pointcut methodCalls() : call (!static * test..*(..)); 
before(): methodCalls() { 
     counter.methodCallCounter(); 
} 

जबकि दूसरा पहलू "निष्पादन" पर तरीकों में गिना जाता है अंक में शामिल होने:

pointcut methodCalls() : execution (!static * test..*(..)); 
before(): methodCalls() { 
     counter.methodCallCounter(); 
} 

methodCallCounter() काउंटर कक्षा में एक स्थिर तरीका है।

छोटे परीक्षण कार्यक्रम के लिए विधि कॉल की संख्या समान है। लेकिन जब मैं एक बड़े कार्यक्रम के साथ परीक्षण कार्यक्रम बदलता हूं तो दूसरे पहलू वर्ग (निष्पादन बिंदुक के साथ) में कॉल कॉल की संख्या कॉल पॉइंटकट के साथ पहलू वर्ग में विधि कॉल की संख्या से अधिक है। यह उचित है क्योंकि कॉल जॉइन पॉइंट सुपर के साथ किए गए कॉल नहीं चुनता है और इसलिए उन्हें गिनता नहीं है।

हालांकि, मुझे एक ऐसे मामले का सामना करना पड़ा जहां प्रोग्राम के विशिष्ट निष्पादन के लिए "कॉल पॉइंटकट" के साथ पहलू वर्ग में गैर-स्थैतिक विधि कॉल संख्या "निष्पादन बिंदु" के साथ पहलू वर्ग में विधि कॉल की संख्या से अधिक थी । मुझे कोई व्याख्या नहीं मिल रही है कि यह क्यों हो रहा है। दूसरी स्थिति के कारण के बारे में कोई विचार सराहना की है।

+0

सुनिश्चित नहीं है ... मैं मतभेदों के बारे में कुछ जानकारी प्रिंट करने की सिफारिश करता हूं। शायद 'thisJoinPoint' ऑब्जेक्ट को प्रिंट करें। –

उत्तर

29

Acutally स्पष्टीकरण काफी सरल है अगर तुम call() और execution() pointcuts के बीच मूल अंतर को समझते हैं: एक ओर जहां पूर्व अवरोध सभी कॉलर्स (अर्थात विधि कॉल के स्रोतों), बाद अवरोध कॉल खुद को कोई फर्क नहीं पड़ता कि वे कहाँ से उत्पन्न।

तो दोनों पॉइंटकट्स द्वारा ट्रिगर किए गए अवरोधों की संख्या अलग-अलग कैसे हो सकती है?

  • आप अपने खुद के कोड से JRE/JDK तरीकों कॉल करते हैं, AspectJ JDK के भीतर निष्पादन joinpoints में अपने कॉल में बुनाई सकते हैं, लेकिन (जब तक आप एक प्रारंभिक कदम के रूप में एक बुनी JDK बनाया है)। इस प्रकार, कॉल की संख्या निष्पादन की संख्या से अधिक होगी।
  • इसी तरह, यदि आप तृतीय पक्ष पुस्तकालयों में विधियों को कॉल करते हैं जिन्हें आपने AspectJ के साथ बुना नहीं है क्योंकि वे एलटीडब्ल्यू या सीटीडब्ल्यू के दौरान इन-पथ पर नहीं थे, तो फिर से निष्पादन पर कब्जा नहीं किया जाएगा।
  • अंतिम, लेकिन कम से कम नहीं, यह दूसरी तरफ हो सकता है यदि आपका स्वयं का बुना हुआ कोड तीसरे पक्ष के libs या जेआरई/जेडीके कक्षाओं द्वारा बुलाया जाता है। इस मामले में निष्पादन की गणना संख्या कॉल की संख्या से अधिक होगी क्योंकि वे आपके AspectJ कोड के नियंत्रण से बाहर स्थानों से उत्पन्न होते हैं।

आम तौर पर, सभी मामलों में कारण समग्र उपयोग कोड और बुने हुए कोड के सबसेट के बीच का अंतर है। दूसरे शब्दों में: आपके (या पहलुओं) नियंत्रण के नीचे और उसके बाद कोड के बीच का अंतर।

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