为此很难给出一个简洁的标题。

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

    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);
    }
}

10-01 15:21