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たときにポイントカットが 2 回ヒットします。Circle.getDimensionsCircle.getDimensionssuper.getDimensions

ポイントカットは次のようになります。@Pointcut("execution(* Shape.getDimensions(..))")

宣言する型の名前を確認するためのアドバイス内にハックを追加しました ( を使用JoinPoint.getSignature().getDeclaringType().getName())。これを行うためのより良い方法があるに違いないと思います。

ある?

フォーメーションがあまり良くない場合は申し訳ありません。ここで初めて質問します(通常、すでに答えを見つけることができます)。

4

1 に答える 1

5

おそらく、ポイントカットがShape+.getDimensions()(プラス記号を使用して) 使用することを意味していた可能性があります。それ以外の場合は、まったく一致しませんでしたCircle

とにかく、次のように問題を解決できます (ネイティブの AspectJ 構文で問題ないことを願っています。より明確で表現力豊かだと思います)。

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

    after() : getDimensionsNoSuper() {
        System.out.println(thisJoinPointStaticPart);
    }
}
于 2012-08-31T07:27:29.397 に答える