「内功一层」- 搭建 JDK 源码的阅读环境

1,689 阅读3分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

1. 前言

不要小看环境搭建这个过程,鲁xun说过,能把每一件小事都做好的运气都不会太差

1.1 为什么要读源码?

  • 装杯;对公司新进来的实习生,特别是程序媛实习生,给予最大的打击,告诉 他/她,我们有多卷!
  • 面试逃不掉;要么你搁这给面试官吹,要么你搁这给面试者吹。
  • 学习优秀的代码、思想、模式等;假的,鉴定完毕,学习的成就感哪有装杯来的高!
  • 治疗催眠;亲测有效,你睡前王者肯定不止一把;睡前源码肯定超不过两段!

1.2 为什么要给源码单独搭建阅读环境?

  1. 看完后,总得留下点什么
  2. 看完后,总得输出点什么
  3. 下次来,总得记得看了什么

举个例子,你就明白了:

你去洗脚,点了8号技师,那你去了洗脚城,你没留下点什么吗?你没输出点什么吗?不要想歪,对应到源码上,这是注释!这些注释一整理,就是一篇合格的文章,一篇有输出深度的文章!

8号对应的是简单的源码,那人家洗脚城不用 1234567 呢,用 UUID 编号呢,你不得记下来?这就是第三点,你下次再来,总得知道你看了什么,这对应到源码上,就是注释和 Debug 的断点

总的来说,就是搭建一个集中调试集中看代码集中写注释的环境


1.3 源码应该怎么读?

  1. 按需阅读;哪里能装点哪里
  2. 系统阅读;一个模块一个模块的读
  3. 一边调试一边读;断点是程序猿/媛的好朋友,IDE 也是
  4. 养成注释的好习惯;不管是写代码,还是读代码,都要养成写注释的良好习惯,怎么样才算一个好注释?我认为的标准是,其他人能看懂的、规范的注释才是合格的好注释

2. 准备阶段

你需要有:

  • IntelliJ IDEA (本文使用了 IntelliJ IDEA Ultimate 2021.1.3)
  • JDK源码包(本文使用了 JDK1.8 源码包在$JAVA_HOME 可以找到,在 Windows 平台上他叫 src.zip
  • JDK 缺失的两个类,在 3.4 小结详细说明了如何获取

3. 正式搭建环境

3.1 创建项目

首先创建一个普通的 Java 项目即可


3.2 导入源代码

首先创建对应的包结构

导入 JDK 源码

在 JDK 的安装目录中,拿到 src.zip,这就是 JDK 的源码了,我们把他解压出来,拷贝到 source 文件夹中,建议直接在磁盘拷入对应路径,直接往 IDEA 里贴容易卡死


3.3 更改 JDK 源路径

打开项目结构设置,添加一个 JDK,并把源代码的路径替换成我们存放源代码的 source 包路径,新增一个JDK的原因是为了和我们平时项目中使用的 JDK 配置分开


3.4 导入两个缺失的类

为了让 JDK 可以成功编译,需要到官网复制两个类到本地

先新建两个空的类

然后我们去官网,将对应的代码复制进去:>>> 链接

在下面的两个包中找到对应的类,拷贝到我们刚创建的空类中,什么都不需要改


3.5 导入缺少的 lib 依赖

打开项目结构设置 → 模块 → 添加 JAR 包,选择 $JAVA_HOME/lib/tools.jar

如下图


3.6 允许 IDEA 调试时进入源码

IDEA 在调试代码时,源代码是有保护的,默认不进入源代码,我们需要把这一项去掉

回到 IDEA 项目主界面,点击编译或者 Ctrl + F9,等编译完后就可以愉快的玩耍了,如果编译的过程提示内存不足,最好给编译器加点内存

看编译时的占用,将内存设到 1G 差不多了

4. 测试环境是否搭建成功

test 包下建立一个测试类,来测试 Debug 能否正常跳转到源码

public class Test {
    public static void main(String[] args) {
        HashMap<Integer, Integer> map = new HashMap<>();

        map.put(1, 1);
    }  
}

同时在 HashMap 的 put() 方法打上断点,运行调试

成功进入源码,美滋滋,又有一个项目在磁盘吃灰


写在最后

输出才能倒逼输入,坚持看源码,写注释,输出文章;某天一回头,你会发现原来你坚持了这么久