我正在玩aop和aspectj并发现(对我来说)意想不到的行为。
在aspectj-docs中,我找到了以下示例 - 切入点:
execution(public void Middle.*())
用于以下类定义(我略微更改了原始示例):
class Super {
public void m() { ... }
}
class Middle extends Super {
}
class Sub extends Middle {
@Override
public void m() { ... }
}
该例子的描述说明:
[切入点]为所有返回void且没有参数的公共方法执行所有方法执行,这些参数在Middle 中声明或继承,即使这些方法在子类中重写中间。
这个示例对我来说很好,但是如果类Sub
没有覆盖m()
,那么从{outside}到m
实例的方法调用不是Sub
截获。这不违反文件吗?
我有another problem with pointcuts in inhertied classes这是由使用代理引起的。但在这种情况下,使用代理不会导致此行为,因为代理应该为所有代理类提供方法。或者我错过了什么?
我的方面定义:
@Aspect
public class MyAspect {
@Before(value = "execution(* Middle.*(..))", argNames="joinPoint")
public void myAdvice(JoinPoint joinPoint) {
System.out.println("adviced: " + joinPoint.getSignature());
}
}