有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

C#是我最熟悉的语言,但在工作时使用Java。我想你可以说我对使用VisualStudioIDE非常满意。我喜欢它的调试器之一是,我可以为任何表达式放置监视变量(“Eclipse中的表达式”)。因此,在调试过程中,我可以毫不费力地查看特定字段public或non-public、call方法等的值

在Eclipse中,我似乎做不到同样的事情。我必须求助于为字段调用关联的getter方法(假设它有一个)。如果它没有一个,我要么临时添加一个,这样我就可以查看它,并记得在我完成后删除它,要么我只是一个傻瓜

如何将对象的watch表达式放在其私有字段中?还是我只是做错了,我必须精心设计特殊的表达方式才能看到它们
(或者有没有更好的方法让我获得我想要的信息?)

例如:

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

字段名显然是requestURI,因此我添加了表达式:request.requestURI。Eclipse抛出一个错误,说它不是一个字段(它是,它只是不是公共的)。我没有直接去字段,而是去了getter:request.getRequestURI(),这样很好。但我不能总是指望有人能来

the variables view
变量视图

the expressions view
表达式视图


共 (4) 个答案

  1. # 1 楼答案

    在Expressions视图中编写表达式的计算结果就像您编写了一行代码,并在当前高亮显示的行之前执行它一样。我知道有一个区别(可能是其他人知道的,但这是重要的一个),那就是您可以绕过类访问器可见性限制,看到当前堆栈框架可能无法看到的私有、受保护和默认成员

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

    现在,我不能说,为什么他们不在表达式中像在变量中一样展示同样的魔力,正如你所指出的,他们列出了具体类的所有成员,即使声明的类型不会显示它们

  2. # 2 楼答案

    不管字段是private还是protected,eclipse表达式都将正确计算。但变量的范围很重要

    如果我错了,请纠正我

    requestURIorg.apache.catalina.core.ApplicationHttpRequest中的受保护字段,它实现了HttpServletRequest。在您的例子中,变量request的类型为HttpServletRequest,您正在尝试访问HttpServletRequest.requestURI,但此字段不存在,eclipse失败。我觉得这很正常。可能是若你们做了适当的铸造,表达式将正确计算

  3. # 3 楼答案

    在Eclipse中调试时,您可以右键单击变量并单击“监视”菜单项。在Debug透视图中,它将添加一个表达式选项卡,其中包含您正在监视的变量列表。我不知道如何在其他IDE中实现它

  4. # 4 楼答案

    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