我定义了一个 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
}
}
我做错了什么?
谢谢
最佳答案
此声明错误将捕获所有无效 toString
方法的声明:
declare error
: !within(Point) && execution(public String Point.toString())
: "Forbidden call operation!";
这让您成功了一半。另一部分是使用这个:
declare error
: call(public String (Point+ && !Point).toString())
: "Forbidden call operation";
我不太确定为什么您的声明变体不起作用,但上面的切入点更短、更明确并且值得推荐(最重要的是……可以正常工作)。
关于java - AspectJ "declare error"未按预期捕获方法。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16510286/