2

親クラス:

public class Animal {
  public String name() {
    return "my name";
  }
}

子クラス:

public class Dog extends Animal {
  // no methods
}

AspectJでへの呼び出しをクロスカットしようとしていますDog.name()が、機能しません:

@Aspect
public class Crosscut {
  @Around("execution(* Dog.name())")
  public Object exec(ProceedingJoinPoint point) {
    // this point is never reached
  }
}

ただし、子メソッドをDogクラスに追加すると、クロスカットは機能します。

public class Dog extends Animal {
  public String name() {
    return super.name();
  }
}

正しいクロスカットを書く方法は?それともまったく不可能ですか?

4

2 に答える 2

1

ここではaspectjは新しいメソッドを作成しないため、一致させることはできませんDog.name()。あなたがする必要があるのは、アドバイスを宣言し、aspectjにランタイムinstanceofチェックを追加させるためにAnimal.name()使用することです。this(...)

試す @Around("execution(* Animal.name()) && this(Dog)")

于 2013-02-25T10:57:02.313 に答える
1

実際にはjontroのアイデアは良いですが、に固執していないが、上のすべてのメソッドとそのサブクラスDogをインターセプトしたい場合の解決策はより簡単です。name()Animal

@Around("execution(* Animal+.name())")
于 2013-02-25T15:55:40.943 に答える