2012-08-31 9 views
6

इसके लिए एक संक्षिप्त शीर्षक बनाना मुश्किल है।कट ऑफ सुपरक्लास पर दो बार पॉइंटकट मारने से कैसे बचें, लेकिन व्युत्पन्न क्लास ओवरराइड करता है?

वैसे भी, कल्पना मैं एक माता पिता के वर्ग है:

public class Shape { 
     public Dimensions getDimensions() { 
      // Does some generic stuff. 
     } 
    } 

मैं इसमें से एक व्युत्पन्न वर्ग कि getDimensions विधि ओवरराइड करता है:

public class Circle extends Shape { 
     public Dimensions getDimensions() { 
      // Does some stuff. 
      super.getDimensions(); 
     } 
    } 

जब मैं Shape.getDimensions पर एक pointcut साथ एक पहलू बनाने , पॉइंटकट दो बार मारा जाता है जब Circle.getDimensions कहा जाता है: एक बार Circle.getDimensions के लिए, फिर एक बार जब यह super.getDimensions पर कॉल करता है।

pointcut इस तरह दिखता है: @Pointcut("execution(* Shape.getDimensions(..))")

मैं घोषित प्रकार का नाम (JoinPoint.getSignature().getDeclaringType().getName() का प्रयोग करके) की जाँच करने के सलाह के अंदर एक हैक जोड़ दिया है, लेकिन मैं इसे नहीं बल्कि सकल खोजने के लिए और यह एक हैक की तरह तरह का मानना ​​है । मुझे लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए।

क्या वहां है?

क्षमाकरण अगर प्रारूपण बहुत अच्छा नहीं है। पहली बार यहां एक प्रश्न पूछना (मैं आमतौर पर पहले से ही जवाब पा सकता हूं)।

उत्तर

5

शायद आप का मतलब है कि आपका पॉइंटकट Shape+.getDimensions() (प्लस साइन के साथ) का उपयोग करता है, अन्यथा यह Circle से मेल नहीं खाता होता।

वैसे भी, अगर आप इस तरह की समस्या का समाधान कर सकते हैं (मुझे आशा है कि देशी AspectJ वाक्य रचना आप के लिए ठीक है, मैं इसे इतना स्पष्ट और अधिक अर्थपूर्ण लगता है):

public aspect ShapeAspect { 
    pointcut getDimensions() : execution(* Shape+.getDimensions()); 
    pointcut getDimensionsNoSuper() : getDimensions() && !cflowbelow(getDimensions()); 

    after() : getDimensionsNoSuper() { 
     System.out.println(thisJoinPointStaticPart); 
    } 
} 
+0

वर्क्स खूबसूरती से है, धन्यवाद। मैं एनोटेशन शैली के लिए अधिक उपयोग किया जाता है, लेकिन कुंजी cflowbelow कॉल था। यह पता लगाने की कोशिश में कि क्या मैं इसे एक ही सलाह में समझ सकता हूं (इसे समझ नहीं पाया), मुझे यह सुंदर परिशिष्ट मिला: http://www.eclipse.org/aspectj/doc/next/progguide/ semantics-pointcuts.html – Depressio

+0

तो मेरे उत्तर को स्वीकार करने और ऊपर उठाने के लिए अग्रिम धन्यवाद। ;-) कृपया कीजिए। – kriegaex

+0

मुझे ऐसा करने के लिए स्पष्ट रूप से 15 अंक की आवश्यकता है। मेरे पास केवल 11 है। मेरा विश्वास करो, मैंने कोशिश की! :( – Depressio

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