6

很难为此制定一个简洁的标题。

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

    public class Shape {
        public Dimensions getDimensions() {
            // Does some generic stuff.
        }
    }

我有一个派生类,它覆盖了 getDimensions 方法:

    public class Circle extends Shape {
        public Dimensions getDimensions() {
            // Does some stuff.
            super.getDimensions();
        }
    }

当我创建一个切入点 on 的切面时,Shape.getDimensions切入点在被调用时被击中两次Circle.getDimensions:一次 for Circle.getDimensions,然后一次调用super.getDimensions.

切入点如下所示:@Pointcut("execution(* Shape.getDimensions(..))")

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

有没有?

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

4

1 回答 1

5

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

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

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

    after() : getDimensionsNoSuper() {
        System.out.println(thisJoinPointStaticPart);
    }
}
于 2012-08-31T07:27:29.397 回答