Отладка динамического c создания прокси изменяет состояние обработчика вызовов - PullRequest
2 голосов
/ 12 января 2020

С учетом следующего прокси-сервера Dynami c 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 будет записано следующее:

Флаг равен true

Флаг равен false

Однако при пошаговой отладке выдается:

Флаг равен false

Флаг ложен

Я использую Java 11.0.5 и IntelliJ IDEA для отладки.

Кто-то знает, что здесь произошло?

1 Ответ

2 голосов
/ 12 января 2020

Вид объекта toString () * Известно, что опция вызывает побочные эффекты во время отладки, так как вызывает методы, которые не вызываются во время нормального выполнения приложения. Если состояние вашего приложения зависит от этих методов, вы должны отключить соответствующую опцию (File | Settings | Build, Execution, Deployment | Debugger | Data Views | Java: Включить Вид объекта 'toString ()' ):

Enable toString object view

...