如何从父类交叉切割方法?

时间:2013-02-25 10:36:48

标签: java aop aspectj

家长班:

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();
  }
}

如何编写正确的横切?或者根本不可能?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

实际上jontro的想法很好,但是如果你没有注意到Dog,但希望拦截name()及其子类上的所有Animal方法,解决方案会更简单:

@Around("execution(* Animal+.name())")