java - Eclipse调试到java源,不列出源类的成员变量
问题描述
我正在尝试调试 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
带有方法的局部变量也没有被捕获
我该怎么做才能像调试任何其他源类一样通过 java 源进行调试?
我尝试在“编辑源查找路径”对话框中引用src.zip以及提取的 src.zip 版本,但它们都不起作用。
好心提醒。
解决方案
类字段。在您发布的显示中,您实际上并没有停止在HashMap.put(K,V)
方法中,而是在HashMap.hash(Object)
方法(put
调用)中。 hash(Object)
是一种static
方法——它在没有任何“实例”上下文(特别是this
)的情况下执行。
如果您沿着堆栈向下查找该put(K,V)
方法(或任何其他实例方法),您将看到它有一个 HashMap 对象作为this
. 如果尚未展开,请单击加号框以查看类中的所有字段。
尽管静态字段(仅)可由静态方法访问(并且取决于可见性,可访问其他没有或使用实例的类中的方法),但“变量”窗口/视图无法找到它们. 您可以在“表达式”窗口/视图中访问单个静态字段——尽管在标准 (JDK) 类中,我查看的静态字段大多是常量,其值在源代码中给出,因此使用调试器查看它们不是非常有用。
局部变量。较旧的 Oracle 版本显然是使用LineNumber(和 SourceFile)调试信息编译的,但没有LocalVariable 调试信息。这些是单独的子选项;参见帮助信息或手册javac
。如果类文件中没有这些信息,调试器不会显示局部变量或参数名称(它会显示参数值arg0 arg1
等,因为类型信息在基本类文件数据中)。
我不知道他们为什么这样做;也许这是预开源时代的遗留物。Oracle 为较新版本(j9 及更高版本)构建,而我可以轻松检查的一些OpenJDK 构建是否具有LocalVariables。您可以尝试其中一种(使用较新的版本可能在某种程度上取决于您的 Eclipse 版本)。
推荐阅读
- r - Split columns or vector to pass to Purrr Function
- javascript - socket.io 监听器在功能性 React 中触发太多次
- eloquent - Laravel 6 集合 - 从记录中提取单个值
- python - 对角化 + 可训练的自定义 Tensorflow 层
- ruby - 升级 Ruby 2.4 后出现 ArgumentError
- vim - vim 的日志文件高亮显示
- excel - 如何强制 Excel 以文本形式打开日志文件?
- c# - 使用c#在合并值中拆分并获取字符串后的值
- c++ - 没有循环的循环
- r - 将netcdf文件合并为一个并制作时间序列