我正在玩 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 中声明或继承的参数的公共方法挑选所有方法执行,即使这些方法在 Middle 的子类中被覆盖。
这个例子对我来说工作得很好,但是如果 classSub
没有覆盖,则不会拦截从外部到on a -instancem()
的方法调用。这不违反文档吗?m
Sub
我在继承类中遇到了另一个问题,这是由使用代理引起的。但在这种情况下,使用代理不会导致这种行为,因为代理应该为所有代理类提供方法。还是我错过了什么?
我的方面定义:
@Aspect
public class MyAspect {
@Before(value = "execution(* Middle.*(..))", argNames="joinPoint")
public void myAdvice(JoinPoint joinPoint) {
System.out.println("adviced: " + joinPoint.getSignature());
}
}