我正在尝试调试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()
方法时会发生什么。
我已经使用编辑源查找路径对话框添加了源档案:
现在我的问题是,当我调试put()
类中的java.util.HashMap
方法时,变量选项卡没有列出其成员变量。相反,我只是看到将参数传递给相应的方法:
局部变量withing方法也未捕获
如何才能像调试其他任何源类中那样通过java源进行调试?
我尝试在 Edit Source Lookup Path 对话框中引用 src.zip 以及src.zip的提取版本,但这两个都不起作用。
请告知。
答案 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版本)。