Java: 调试器如何显示私有字段?
Java: How does the debugger show private fields?
如果在 Java class 中定义为 'private' 的字段只能从它们自己的 class 中访问 - 调试工具如何显示它们及其值我们正在遍历执行代码?
用于说明的画中画屏幕截图:
我最好的猜测是 JVM 具有允许特殊调试包访问这些的调试模式。
运行 在调试模式下(例如来自 IDE 的调试配置)允许这个特殊包(IDE 知道使用)做它的事情。
这很有趣...没有工作依赖于您在这里的回答:)
在基于 OpenJDK 代码库的 JVM 中,调试器使用 JVMTI 代理访问被调试程序的状态。代理调用 JVMTI 本机 API。这允许代理(以及调试器)读取和写入对象字段、局部变量等的值。 JVMTI APIs 忽略可访问性。 (与 JNI APIs 的方式相同。)
有关详细信息,请阅读 JVM Tools Interface documentation。
有关更广泛的视图,请参阅 Java Platform Debugger Architecture documentation。 JVMTI 是该体系结构的一部分。
如果在 Java class 中定义为 'private' 的字段只能从它们自己的 class 中访问 - 调试工具如何显示它们及其值我们正在遍历执行代码?
用于说明的画中画屏幕截图:
我最好的猜测是 JVM 具有允许特殊调试包访问这些的调试模式。 运行 在调试模式下(例如来自 IDE 的调试配置)允许这个特殊包(IDE 知道使用)做它的事情。
这很有趣...没有工作依赖于您在这里的回答:)
在基于 OpenJDK 代码库的 JVM 中,调试器使用 JVMTI 代理访问被调试程序的状态。代理调用 JVMTI 本机 API。这允许代理(以及调试器)读取和写入对象字段、局部变量等的值。 JVMTI APIs 忽略可访问性。 (与 JNI APIs 的方式相同。)
有关详细信息,请阅读 JVM Tools Interface documentation。
有关更广泛的视图,请参阅 Java Platform Debugger Architecture documentation。 JVMTI 是该体系结构的一部分。