java - 调试动态代理创建会改变调用处理程序状态

标签 java debugging intellij-idea dynamic-proxy

给定以下带有调用处理程序的动态 java 代理,该调用处理程序的内部状态在调用期间会发生变化:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        Test test = (Test) Proxy.newProxyInstance(
                Test.class.getClassLoader(),
                new Class[] { Test.class },
                new MyInvocationHandler(true));
        test.doWork();
        test.doWork();
    }

    public interface Test {
        void doWork();
    }

    public static class MyInvocationHandler implements InvocationHandler {
        private boolean flag;
        public MyInvocationHandler(boolean flag) {
            this.flag = flag;
        }
        @Override
        public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
            if ("doWork".equals(method.getName())) {
                System.out.println("Flag is " + flag);
            }
            if (flag) {
                flag = false;
                // Do somemthing
            }
            return null;
        }
    }
}

我希望将以下内容写入标准输出:

Flag is true

Flag is false

但是在逐步调试时,它输出:

Flag is false

Flag is false

我使用 Java 11.0.5 和 IntelliJ IDEA 进行调试。

有人知道这里发生了什么吗?

最佳答案

“toString()”对象 View 选项已知会在调试期间产生副作用,因为它将调用正常应用执行期间不会调用的方法。如果您的应用状态依赖于这些方法,您应该禁用相应的选项(文件 | 设置 | 构建、执行、部署 | 调试器 | 数据 View | Java: 启用“toString()”对象 View ):

Enable toString object view

关于java - 调试动态代理创建会改变调用处理程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59698975/

相关文章:

node.js - WebStorm 已将目录中的所有文件标记为非项目文件

java - 为什么我正在创建的文本文件中缺少最后几行?

java - 如何同步我的端口扫描仪,以便结果按照执行顺序显示?

java - Java 5“Executor”的正确发音是什么?

python - 记录多线程应用程序中的锁获取和释放调用

scala - 如何在 IntelliJ 中找到 Scala 类的构造函数的用法?

java - 如何将Cucumber测试添加到预先存在的Gradle项目(Java)?

java - 如何制作参数化方法?

java - 如何运行 Eclipse 调试器模式来查看操作顺序?

c# - 使用动态关键字时的调试问题(VS2010)