私はaopとaspectjをいじっていて、(私にとって)予期しない動作を発見しました。
spectj-docsで、次の example-pointcut を見つけました。
execution(public void Middle.*())
次のクラス定義の場合 (元の例を少し変更しました):
class Super {
public void m() { ... }
}
class Middle extends Super {
}
class Sub extends Middle {
@Override
public void m() { ... }
}
その例の説明には次のように記載されています。
[ポイントカット] は、void を返し、Middle で宣言または継承された引数を持たない public メソッドのすべてのメソッド実行を選択します。これらのメソッドが Middle のサブクラスでオーバーライドされている場合でも同様です。
この例は私にとってはうまく機能していますが、クラスSub
がオーバーライドされていない場合m()
、外部からインスタンスへのメソッド呼び出しm
はSub
傍受されません。これはドキュメントに違反していませんか?
プロキシの使用が原因で、継承されたクラスのポイントカットで別の問題が発生しました。ただし、この場合、プロキシを使用してもこの動作が発生することはありません。これは、プロキシがプロキシされるすべてのクラスにメソッドを提供する必要があるためです。それとも私は何かを逃しましたか?
私のアスペクト定義:
@Aspect
public class MyAspect {
@Before(value = "execution(* Middle.*(..))", argNames="joinPoint")
public void myAdvice(JoinPoint joinPoint) {
System.out.println("adviced: " + joinPoint.getSignature());
}
}