5

我正在玩 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()的方法调用。这不违反文档吗?mSub

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

我的方面定义:

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

0 回答 0