给定以下带有调用处理程序的动态 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 ):
关于java - 调试动态代理创建会改变调用处理程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59698975/