当剪切是在超类上时,如何避免两次击中切入点,但是派生类会覆盖?

Dep*_*sio 6 java aspectj super pointcut aspect

为此做一个简洁的标题很难.

无论如何,想象一下我有一个父类:

    public class Shape {
        public Dimensions getDimensions() {
            // Does some generic stuff.
        }
    }
Run Code Online (Sandbox Code Playgroud)

我有一个派生类来覆盖getDimensions方法:

    public class Circle extends Shape {
        public Dimensions getDimensions() {
            // Does some stuff.
            super.getDimensions();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我创建一个带有切入点的方面时Shape.getDimensions,切入点Circle.getDimensions被调用两次:一次用于Circle.getDimensions,然后一次调用super.getDimensions.

切入点看起来像这样: @Pointcut("execution(* Shape.getDimensions(..))")

我在建议中添加了一个黑客来检查声明类型的名称(使用JoinPoint.getSignature().getDeclaringType().getName()),但我发现它相当粗糙,感觉有点像黑客.我认为必须有一个更好的方法来做到这一点.

在那儿?

如果格式不是很好,请道歉.第一次在这里问一个问题(我通常可以找到答案).

kri*_*aex 5

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

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

public aspect ShapeAspect {
    pointcut getDimensions() : execution(* Shape+.getDimensions());
    pointcut getDimensionsNoSuper() : getDimensions() && !cflowbelow(getDimensions());

    after() : getDimensionsNoSuper() {
        System.out.println(thisJoinPointStaticPart);
    }
}
Run Code Online (Sandbox Code Playgroud)