为此很难给出一个简洁的标题。
无论如何,想象一下我有一个家长类:
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("execution(* Shape.getDimensions(..))")
我在建议中添加了一个hack,用于检查声明类型的名称(使用
JoinPoint.getSignature().getDeclaringType().getName()
),但是我发现它相当粗糙,感觉有点像hack。我认为一定有更好的方法可以做到这一点。有没有?
抱歉,如果格式不是很好。第一次在这里问一个问题(我通常已经可以找到答案了)。
最佳答案
可能是您的切入点使用了Shape+.getDimensions()
(带有加号),否则根本不会匹配Circle
。
无论如何,您可以解决这样的问题(我希望原生的AspectJ语法对您来说还可以,我发现它是如此清晰,更具表现力):
public aspect ShapeAspect {
pointcut getDimensions() : execution(* Shape+.getDimensions());
pointcut getDimensionsNoSuper() : getDimensions() && !cflowbelow(getDimensions());
after() : getDimensionsNoSuper() {
System.out.println(thisJoinPointStaticPart);
}
}