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

Java 调试动态代理创建会改变调用处理程序状态,java,debugging,intellij-idea,dynamic-proxy,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) Pr

给定以下具有调用处理程序的动态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;
        }
    }
}
我希望本文能将以下内容写入stdout:

旗帜是真的

国旗是假的

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

国旗是假的

国旗是假的

我正在使用Java11.0.5和IntellijIDEA进行调试

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

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


是的,调试器调用的确实是toString方法。如果(!“toString”.equals(method.getName())&&flag){
也可以将mutation子句的保护更改为
if(!“toString”.equals(method.getName())&&flag)。