Java:调试器如何显示私有字段?
Posted
技术标签:
【中文标题】Java:调试器如何显示私有字段?【英文标题】:Java: How does the debugger show private fields? 【发布时间】:2020-07-28 11:37:25 【问题描述】:如果在 Java 类中定义为“私有”的字段只能从它们自己的类中访问 - 当我们遍历正在执行的代码时,调试工具如何显示它们及其值?
用于说明的画中画截图:
我最好的猜测是 JVM 有一个调试模式,允许一个特殊的调试包访问这些。 在调试模式下运行(例如来自 IDE 的调试配置)允许这个特殊的包(IDE 知道使用它)来完成它的工作。
这很有趣...这里没有任何工作依赖于您的回答 :)
【问题讨论】:
您要阅读的术语是反射。参见例如oracle.com/technical-resources/articles/java/…。或在这里:***.com/questions/1196192/… 第二个链接实际上对我想开发的“通用对象快照”工具很有用,以帮助我进行执行后调试,谢谢! 是的,JVM 有一个特殊的调试器 API。您可以向 JVM 询问很多有趣的东西,例如,您可以获得所有现有对象的完整转储。调试器和类似工具使用这些接口来获得对所有内容的完全访问权限。 对于“特殊调试器 API”,请参阅 Java Platform Debugger Architecture (JPDA)。 请注意,private
并不意味着为程序提供任何安全性。如果您确实需要,Java 提供了许多方法来访问您想要的任何内容。例如 Java 代码中的反射 API,或提到的外部应用程序接口。 private
只是代码设计和架构的工具,而不是安全性。防止某人不小心犯错,而不是防止某人故意犯错。
【参考方案1】:
在基于 OpenJDK 代码库的 JVM 中,调试器使用 JVMTI 代理来访问被调试程序的状态。代理调用 JVMTI 本机 API。这允许代理(以及调试器)读取和写入对象字段、局部变量等的值。 JVMTI API 忽略可访问性。 (与 JNI API 一样。)
欲了解更多信息,请阅读JVM Tools Interface documentation。
有关更广泛的视图,请参阅Java Platform Debugger Architecture documentation。 JVMTI 是该架构的一部分。
【讨论】:
我的意思是 JNI。字母汤。以上是关于Java:调试器如何显示私有字段?的主要内容,如果未能解决你的问题,请参考以下文章
无法为不可为空的字段返回 null,调试器不显示 null [重复]