Java 当切入点位于超类上,但派生类重写时,如何避免两次命中切入点?

Java 当切入点位于超类上,但派生类重写时,如何避免两次命中切入点?,java,aspectj,super,aspect,pointcut,Java,Aspectj,Super,Aspect,Pointcut,很难为这篇文章写一个简洁的标题 无论如何,假设我有一个父类: public class Shape { public Dimensions getDimensions() { // Does some generic stuff. } } 我有一个从它派生的类,它重写getDimensions方法: public class Circle extends Shape { public Dimensi

很难为这篇文章写一个简洁的标题

无论如何,假设我有一个父类:

    public class Shape {
        public Dimensions getDimensions() {
            // Does some generic stuff.
        }
    }
我有一个从它派生的类,它重写getDimensions方法:

    public class Circle extends Shape {
        public Dimensions getDimensions() {
            // Does some stuff.
            super.getDimensions();
        }
    }
当我在
Shape.getDimensions
上创建一个带有切入点的方面时,当调用
Circle.getDimensions
时,切入点被击中两次:一次用于
Circle.getDimensions
,然后一次用于调用
super.getDimensions

切入点看起来像这样:
@pointcut(“执行(*Shape.getDimensions(..))”

我在通知中添加了一个hack来检查声明类型的名称(使用
JoinPoint.getSignature().getDeclaringType().getName()
),但我发现它相当粗糙,感觉有点像一个hack。我想一定有更好的办法

有吗


如果格式不太好,我道歉。第一次在这里问问题(我通常已经找到答案了)。

可能你的意思是你的切入点使用了
Shape+.getDimensions()
(带加号),否则它根本就不会匹配

无论如何,您可以这样解决问题(我希望原生AspectJ语法对您来说没问题,我发现它更清晰、更具表现力):

公共方面shapespect{
切入点getDimensions():执行(*Shape+.getDimensions());
切入点getDimensionsNoSuper():getDimensions()&&!cflowDown(getDimensions());
after():getDimensionsNoSuper(){
System.out.println(此连接点静态部分);
}
}

效果很好,谢谢。我更习惯于注释样式,但关键是cflowDown调用。在试图找出是否可以将其浓缩为一个建议(无法找到)的过程中,我发现了这个可爱的附录:所以提前感谢您接受并更新我的答案。;-)请这样做。我显然需要15分。我只有11个。相信我,我试过了(实际上,
执行
也会匹配超类方法,不管是否有
+
@Sean:这就是为什么切入点有另一个条件过滤掉超类方法的执行。你试过吗?