调试时如何直接在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
如果字段是private
或protected
,则无关紧要,eclipse表达式将正确评估。 但变量的范围很重要。
如果我错了,请纠正我。
requestURI
是org.apache.catalina.core.ApplicationHttpRequest
的受保护字段,它实现了HttpServletRequest。 在您的情况下,变量request
的类型为HttpServletRequest,并且您正在尝试访问HttpServletRequest.requestURI
并且此字段不存在且eclipse失败。 我认为这是正常的。 如果您进行适当的投射,表达式将正确评估。
在“表达式”视图中编写表达式就像编写一行代码一样评估,并在当前突出显示的行之前执行它。 我知道的一个区别(可能是其他的,但这是重要的),您可以绕过类访问器可见性限制,并查看当前堆栈框架可能无法访问的私有,受保护和默认成员。
也就是说表达式确实要求您拥有正确的引用类型。 如果您将此行插入代码中,则java编译器会抱怨requestURI不是HttpServletRequest的字段。 因此,您需要强制转换为实际声明该字段的类(或子类):ApplicationHttpRequest。
现在,他们为什么不打扰在Expressions中暴露同样的魔法,就像他们在Variables中那样,当你指出他们列出具体类的所有成员时,即使声明的类型不会显示它们,我也不能说。
在Eclipse中进行调试时,可以右键单击变量并单击Watch菜单项。 在Debug透视图中,它将添加一个Expressions选项卡,其中包含您正在观看的变量列表。 我不确定如何在其他IDE中执行此操作。