Eclipse调试到Java源代码中,未列出源类的成员变量

时间:2019-11-03 16:54:27

标签: java eclipse debugging

我正在尝试调试JDK源文件。更具体地说,我对研究Collection类的内部实现感兴趣。

所以我创建了一个简单的Java项目,并添加了一些示例代码,如下所示:

import java.util.HashMap;
import java.util.Map;

public class HashMapWorking {
    public static void main(String[] args) {
        Map<String, String> demoMap = new HashMap<>();

        demoMap.put("one", "first");
        demoMap.put("two", "second");
        demoMap.put("three", "third");
    }
}

例如,我需要知道调用demoMap.put()方法时会发生什么。

我已经使用编辑源查找路径对话框添加了源档案:

enter image description here

现在我的问题是,当我调试put()类中的java.util.HashMap方法时,变量选项卡没有列出其成员变量。相反,我只是看到将参数传递给相应的方法:

enter image description here

局部变量withing方法也未捕获

如何才能像调试其他任何源类中那样通过java源进行调试?

我尝试在 Edit Source Lookup Path 对话框中引用 src.zip 以及src.zip的提取版本,但这两个都不起作用。

请告知。

1 个答案:

答案 0 :(得分:1)

类字段。。在您发布的显示中,您实际上并没有停留在HashMap.put(K,V)方法中,而是停留在HashMap.hash(Object)方法中(put被调用) 。 hash(Object)是一种static方法-它在没有任何“实例”上下文(特别是this)的情况下执行。

如果将堆栈移至put(K,V)方法(或任何其他实例方法),您将看到它具有一个this的HashMap对象。如果尚未展开,请单击加号框以查看该类中的所有字段。

尽管静态字段(仅)可用于静态方法(并且取决于可见性,也可以访问其他不具有或使用实例的类中的方法),但是“变量”窗口/视图没有办法找到他们。您可以在“表达式”窗口/视图中访问 invididual 静态字段-尽管在标准(JDK)类中,我查看的静态字段大多是常量,其值在源代码中给出,因此看起来用调试器对他们不是很有用。

局部变量。显然,较早的Oracle构建是使用 LineNumber(和SourceFile)调试信息编译的,而没有 LocalVariable调试信息。这些是单独的子选项;请参阅javac的帮助消息或手册。在类文件中没有此信息的情况下,调试器将不会显示局部变量或参数的名称(它会以arg0 arg1的形式显示参数的 values 等,因为 type 信息在基本的类文件数据中)。

我不知道他们为什么这样做;也许这是源代码开放前的遗留物。我为较新的版本(j9及更高版本)和Openem的 some 构建了Oracle版本,我可以轻松地检查 do 是否具有LocalVariables。您可以尝试其中的一种(使用较新的版本在某种程度上取决于您的Eclipse版本)。