一个类的所有方法的切入点,包括继承的方法

tho*_*mas 5 java aspectj spring-aop pointcut

我在玩 aop 和 aspectj 并发现了一个(对我来说)意外的行为。

aspectj-docs 中,我发现了以下示例切入点:

execution(public void Middle.*())
Run Code Online (Sandbox Code Playgroud)

对于以下类定义(我稍微更改了原始示例):

class Super {
    public void m() { ... }
}
class Middle extends Super {
}
class Sub extends Middle {
    @Override
    public void m() { ... }
}
Run Code Online (Sandbox Code Playgroud)

该示例的描述指出:

[切入点] 挑选出返回 void 并且没有在 Middle 中声明或继承的参数的公共方法的所有方法执行,即使这些方法在 Middle 的子类中被覆盖。

这个例子是工作为我好,但如果类Sub不重写m(),该方法通话从外到mSub-instance不拦截。这不违反文档吗?

在继承类中的切入点还有另一个问题,这是由使用代理引起的。但是在这种情况下,代理的使用不会导致这种行为,因为代理应该为所有被代理的类提供方法。还是我错过了什么?

我的方面定义:

@Aspect
public class MyAspect {
    @Before(value = "execution(* Middle.*(..))", argNames="joinPoint")
    public void myAdvice(JoinPoint joinPoint) {
        System.out.println("adviced: " + joinPoint.getSignature());
    }
}
Run Code Online (Sandbox Code Playgroud)