调试时如何直接在IDE中查看其他对象的私有字段?

C#是我最熟悉的语言,但在工作时使用Java。 我想你可以说我对使用Visual Studio IDE很满意。 我喜欢它的调试器之一是我可以为任何表达式放置监视变量(Eclipse中的“表达式”)。 因此,我可以在调试时查看公共或非公共特定字段的值,调用方法等,没有问题。

我似乎不能在Eclipse中做同样的事情。 我不得不求助于为字段调用相关的getter方法(假设它有一个)。 如果它没有,我要么暂时添加一个,所以我可以查看它,记得在我完成时删除它或者我只是SOL。

如何在一个私有字段上为对象设置监视表达式? 或者我只是做错了,我必须制作特殊的表达方式来查看它们?
(或者,有没有更好的方法来获取我想要的信息?)

例如,

我有一个HttpServletRequest并希望密切关注requestURI 。 如果我只是观察请求变量,它会列出很多字段,而且信息太多了。 我只对对象中的一件事感兴趣,所以为了最小化这个,我想为这一件事添加一个表达式。

字段名称显然是requestURI所以我添加了表达式: request.requestURI 。 Eclipse抛出一个错误,说它不是一个字段(它是,它只是不公开)。 我不得不直接进入现场,而是去getter: request.getRequestURI()并且工作正常。 但我不能总是指望吸气剂可用。

变量视图
变量视图

表达式视图
表达式视图

Eclipse评估表达式,考虑Declared Type的私有/受保护字段,而不是Actual Type

例:

 Number n1 = new Integer(1000); Integer n2 = new Integer(1000); 

表达式:

 n1.value can't be evaluate n2.value returns 1000, perfectly 

另一种方法是使用DetailFormatter (右键单击变量> New Detail Formatter)。

当显示类型对象的文本表示时,Eclipse将使用此表达式而不是toString()方法(例如,在“变量视图”中)。

您的DetailFormatter (适用于ApplicationHttpRequest )可以是:

 requestURI 

要么

 "URI: " + requestURI + "\n" + "Path: " + servletPath 

如果字段是privateprotected ,则无关紧要,eclipse表达式将正确评估。 但变量的范围很重要。

如果我错了,请纠正我。

requestURIorg.apache.catalina.core.ApplicationHttpRequest的受保护字段,它实现了HttpServletRequest。 在您的情况下,变量request的类型为HttpServletRequest,并且您正在尝试访问HttpServletRequest.requestURI并且此字段不存在且eclipse失败。 我认为这是正常的。 如果您进行适当的投射,表达式将正确评估。

在“表达式”视图中编写表达式就像编写一行代码一样评估,并在当前突出显示的行之前执行它。 我知道的一个区别(可能是其他的,但这是重要的),您可以绕过类访问器可见性限制,并查看当前堆栈框架可能无法访问的私有,受保护和默认成员。

也就是说表达式确实要求您拥有正确的引用类型。 如果您将此行插入代码中,则java编译器会抱怨requestURI不是HttpServletRequest的字段。 因此,您需要强制转换为实际声明该字段的类(或子类):ApplicationHttpRequest。

现在,他们为什么不打扰在Expressions中暴露同样的魔法,就像他们在Variables中那样,当你指出他们列出具体类的所有成员时,即使声明的类型不会显示它们,我也不能说。

在Eclipse中进行调试时,可以右键单击变量并单击Watch菜单项。 在Debug透视图中,它将添加一个Expressions选项卡,其中包含您正在观看的变量列表。 我不确定如何在其他IDE中执行此操作。