AspectJ“声明错误”没有按预期捕获方法。为什么?

时间:2013-05-12 17:42:29

标签: java aspectj

我定义了一个Point类:

public class Point {
    ...
    public String toString() {
        return "abc";
    }
}

以及应该注意没有人覆盖其toString()方法的方面:

declare error
    : execution(public String Point+.toString()) && !execution(public String Point.toString()) 
    : "Forbidden execution operation!";

declare error
    : call(public String Point+.toString()) && !call(public String Point.toString()) 
    : "Forbidden call operation!";

然而,当键入以下代码时,没有标记任何错误:

class Point4 extends Point {
    public Point4(int x, int y) {
        super(x, y);
    }

    @Override
    public String toString() { //I'd be expecing a compilation error here.
        return super.toString();
    }
}

public class Main {
    public static void main(String[] args) {
        Point4 p = new Point4(2, 3);
        System.out.println(p.toString()); //I'd be expecting a compilation error here
    }
}

我做错了什么?

由于

1 个答案:

答案 0 :(得分:1)

此声明错误将捕获无效toString方法的所有声明:

declare error
: !within(Point) && execution(public String Point.toString()) 
: "Forbidden call operation!";

这让你有一半的路程。另一件是用这个:

declare error
: call(public String (Point+ && !Point).toString())
: "Forbidden call operation";

我不确定为什么你的这个声明的变体不起作用,但上面的切入点更短,更明确和推荐(最重要的是......正常工作)。