java调试时如何直接在IDE中查看其他对象的私有字段?
C#是我最熟悉的语言,但在工作时使用Java。我想你可以说我对使用VisualStudioIDE非常满意。我喜欢它的调试器之一是,我可以为任何表达式放置监视变量(“Eclipse中的表达式”)。因此,在调试过程中,我可以毫不费力地查看特定字段public或non-public、call方法等的值
在Eclipse中,我似乎做不到同样的事情。我必须求助于为字段调用关联的getter方法(假设它有一个)。如果它没有一个,我要么临时添加一个,这样我就可以查看它,并记得在我完成后删除它,要么我只是一个傻瓜
如何将对象的watch表达式放在其私有字段中?还是我只是做错了,我必须精心设计特殊的表达方式才能看到它们
(或者有没有更好的方法让我获得我想要的信息?)
例如:
我有一个HttpServletRequest
,想关注一下requestURI
。如果我只是观察request变量,它会列出很多字段,而且信息太多了。我只对对象中的一件事感兴趣,所以为了最小化这一点,我想为这件事添加一个watch表达式
字段名显然是requestURI
,因此我添加了表达式:request.requestURI
。Eclipse抛出一个错误,说它不是一个字段(它是,它只是不是公共的)。我没有直接去字段,而是去了getter:request.getRequestURI()
,这样很好。但我不能总是指望有人能来
变量视图
表达式视图
# 1 楼答案
在Expressions视图中编写表达式的计算结果就像您编写了一行代码,并在当前高亮显示的行之前执行它一样。我知道有一个区别(可能是其他人知道的,但这是重要的一个),那就是您可以绕过类访问器可见性限制,看到当前堆栈框架可能无法看到的私有、受保护和默认成员
也就是说,表达式确实要求您具有正确的引用类型。如果在代码中插入这一行,java编译器会抱怨requestURI不是HttpServletRequest的字段。因此,您需要强制转换到实际声明字段的类(或的子类):ApplicationHttpRequest
现在,我不能说,为什么他们不在表达式中像在变量中一样展示同样的魔力,正如你所指出的,他们列出了具体类的所有成员,即使声明的类型不会显示它们
# 2 楼答案
不管字段是
private
还是protected
,eclipse表达式都将正确计算。但变量的范围很重要如果我错了,请纠正我
requestURI
是org.apache.catalina.core.ApplicationHttpRequest
中的受保护字段,它实现了HttpServletRequest。在您的例子中,变量request
的类型为HttpServletRequest,您正在尝试访问HttpServletRequest.requestURI
,但此字段不存在,eclipse失败。我觉得这很正常。可能是若你们做了适当的铸造,表达式将正确计算# 3 楼答案
在Eclipse中调试时,您可以右键单击变量并单击“监视”菜单项。在Debug透视图中,它将添加一个表达式选项卡,其中包含您正在监视的变量列表。我不知道如何在其他IDE中实现它
# 4 楼答案
Eclipse计算表达式时考虑的是
Declared Type
的私有/受保护字段,而不是Actual Type
例如:
表达方式:
另一种方法是使用
DetailFormatter
(在变量>;New Detail Formatter中单击鼠标右键)当显示类型为的对象的文本表示时(例如在变量视图中),Eclipse将使用此表达式而不是toString()方法
您的
DetailFormatter
(对于ApplicationHttpRequest
)可以是:或