java - IntelliJ IDEA 多次调试进入方法

标签 java debugging intellij-idea dynamic-proxy

调试以下代码时:

public class MyProxy {
    public static void main(String[] args){

        Consumer f = (Consumer) Proxy.newProxyInstance(
                Consumer.class.getClassLoader(),
                new Class[] { Consumer.class },
                new Handler(new ConsumerImpl())
        );

        f.consume("Hello");   // set breakpoint here
        System.out.println("done");
    }
}

interface Consumer {
    void consume(String s);
}

class ConsumerImpl implements Consumer {
    public void consume(String s) {
        System.out.println(s);
    }
}

class Handler implements InvocationHandler {
    private final Consumer original;
    public Handler(Consumer original) {
        this.original = original;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws IllegalAccessException, IllegalArgumentException,
            InvocationTargetException {
        System.out.println("BEFORE");
        method.invoke(original, args);
        System.out.println("AFTER");
        return null;
    }
}

输出是:

BEFORE
AFTER
BEFORE
AFTER
BEFORE
BEFORE
AFTER
Hello
BEFORE
AFTER
AFTER
BEFORE
AFTER
BEFORE
AFTER
BEFORE
AFTER
BEFORE
AFTER
done
BEFORE
AFTER

当调试器在断点行暂停时,输出已经有两行,当我进入 invoke 方法时,输出如图所示。这就像调试器在我执行的每一步中都进入 invoke 方法。因为如果我不进入该方法,输出是:

BEFORE
AFTER
BEFORE
Hello
AFTER
BEFORE
AFTER
done
BEFORE
AFTER

如果我运行代码,输出将如预期。

BEFORE
Hello
AFTER
done

这是调试器的错误还是我做错了什么?

环境:Windows 64、Intellij IDEA、JDK8

最佳答案

这不是 IDEA 中的错误。如果您尝试在没有任何断点的情况下进行调试,您可能会得到与预期相同的结果。 但是如果你设置一些断点,IDEA将尝试调用toString()方法,然后调用它可以评估的变量的hashCode()方法。

最终,对于所有方法,它都会调用您的 InitationHandler 实现(不仅对于“consume”方法,您可以打印 method.getName() 以在调用处理程序实现中确保这一点)。

关于java - IntelliJ IDEA 多次调试进入方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42972312/

相关文章:

java - LRU 和 MRU 缓存逐出策略的排序键数据结构

javascript - 如何调试在谷歌应用脚​​本中不相等的相同字符串?

java - IntelliJ - 连接到 PostgreSQL 时出现问题

intellij-idea - intellij idea 中的项目组

java - 如何按值设置选定的索引JComboBox

java - Android通知IntentService中的deleteIntent调用函数

java - 如何在应用程序中正确处理对文件的引用?

iphone - 应用程序在 iPhone 上崩溃但在模拟器上没有

C++:const static DEBUG 和 if 语句,实际的执行时间开销是多少?

java - "org.reflections.Reflections - could not get type for name"当对包含 groovy 类的包使用反射时