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:这就是为什么切入点有另一个条件过滤掉超类方法的执行。你试过吗?