2012-08-31 7 views
6

これは簡潔なタイトルを作るのは難しいです。とにかくカットがスーパークラスにあり、派生クラスがオーバーライドされているときにポイントカットを2回押すのを避けるには?

、私は親クラスを持っていると想像:

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に1回、super.getDimensionsが1回呼び出されると、ポイントカットが2回実行されます。

ポイントカットはこのようなものになります。@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コールでした。私がそれを1つのアドバイスに凝縮できるかどうかを判断しようとする過程で、私はこの素敵な付録を見つけました:http://www.eclipse.org/aspectj/doc/next/progguide/ semantics-pointcuts.html – Depressio

+0

私の答えを受け入れてupvotingすることに、事前に感謝します。 ;-) してください。 – kriegaex

+0

私は明らかにそうするために15ポイントが必要です。私は11歳しか持っていません。私を信じて、私は試しました! : – Depressio

関連する問題