2

父类:

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

儿童班:

public class Dog extends Animal {
  // no methods
}

我正在尝试Dog.name()使用 AspectJ 横切调用,但不起作用:

@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

其实 jontro 的想法很好,但是如果你不关注Dog,但想拦截on及其子类的所有name()方法,解决方案会更简单:Animal

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

由于 aspectj 没有在这里创建新方法,因此无法匹配Dog.name()。您需要做的是声明建议Animal.name()并用于this(...)使 aspectj 添加运行时 instanceof 检查。

尝试 @Around("execution(* Animal.name()) && this(Dog)")

于 2013-02-25T10:57:02.313 回答