java - AspectJ "declare error"未按预期捕获方法。为什么?

标签 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
    }
}

我做错了什么?

谢谢

最佳答案

此声明错误将捕获所有无效 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/

相关文章:

java - 找不到空指针异常

java - Android fragment 与回收器 View 通信

java - joinPoint.proceed() 有什么作用?

spring - 如何在Spring Boot中对私有(private)/ protected RequestMapping进行AOP

java - 错误空指针异常 : lock == null

java - 如何将本地字符串值传递给 html 代码?

java - 如何在公共(public)方法中使用私有(private)方法来检查有效性?

java - 如何在 AspectJ 中获取 joinPoint.proceed() 结果的参数?

Java 预处理器 - 将代码插入每个函数

java - AspectJ:访问私有(private)字段?