2012-08-31 24 views
6

很難爲此製作一個簡潔的標題。如何避免切入超類時切入兩次切入點,但是派生類重寫?

反正想象我有一個父類:

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

我已經從它來覆蓋getDimensions方法派生類:當我創建一個方面與Shape.getDimensions切入點

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

,當Circle.getDimensions被調用時,切入點被擊中兩次:一次爲Circle.getDimensions,然後一次當它調用super.getDimensions時。

切入點看起來是這樣的:@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