1. 基础设置

① 使用创建新的工程 JavaSourceLearn 专门用于源码学习,基础设置就好。

② 建立 sourcetest 两个包,前者用于放JDK源码,后者用于测试入口。

③ 通过在终端 echo $JAVA_HOME 或IDEA内的 Project Structure-SDK 找到JDK的位置,解压源码 src.zip

④ 在IDEA source 包右键 reveal in finder,并将解压后的源码导入。

⑤ 在 test.hashmap 下建一个测试类,写一个简单的 HashMap 测试,打断点并调试:

  1. package cn.agoclover.test.hashmap;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class Test {
  5. public static void main(String[] args) {
  6. Map<String, Double> hashMap = new HashMap<>();
  7. hashMap.put("K1", 0.1);
  8. hashMap.put("K2", 0.2);
  9. hashMap.put("K3", 0.3);
  10. hashMap.put("K4", 0.4);
  11. }
  12. }

⑥ 会发现资源不足,在 preference-Build-Compiler-Build process heap size 调为1700,重新调试即可编译成功。

⑦ 此时 F7-单步-Step into 发现无法进入底层源码,这是因为JDK源码是受保护的,一般的单步调试是不允许进源码的。Preference-Build-Debugger-Stepping 内取消勾选 Do not step into the classes

⑧ 重新调试,按 F7 即可进入 HashMap 的源码。

⑨ 但此时在源码调试中,不可以注释,源码加锁,尝试右下角解锁也解不了,使用的是 $JAVA_HOME 处的 src.zip 安装包。Projects structure-SDK-Source path,去掉 src.zip,添加此项目下的源码。关闭 Test.java 以外的文件,再重新调试,进入源码,此时 HashMap.java 则不再有锁,且关联的就是当前项目下的源码:
Java源码学习设置与准备 - 图1

2. 需要了解的源码

JDK 中包有哪些:

  1. java.lang : 包含一些Java语言的核心类, 如 String, Math, Integer, System 和 Thread, 提供常用功能.
  2. java.net : 包含执行与网络相关的操作的类和接口.
  3. java.io : 包含能提供多种输入/输出功能的类.
  4. java.util : 包含一些实用工具类, 如定义系统特性, 接口的集合框架类使用与日期日历相关的函数.
  5. java.text : 包含了一些java格式化相关的类.
  6. java.sql : 包含了java进行JDBC数据库编程的相关类/接口.
  7. java.awt : 包含了构成抽象窗口工具集(abstract window toolkits)的多个类, 这些类被用来构建和管理应用程序的图形用户界面(GUI).
  8. java.applet : 包含applet运行所需的一些类.

以下为java基础但很重要的包或类,会不断修改和补充:

|-java
    |-lang 基础语法和包装类型
    |   |-reflect java的反射机制
    |   |-annotation
    |   |-Character 字符串
    |   |-Long 包装类
    |   |-Class 基础的类
    |   |-Enum 枚举
    |   |-Exception 异常定义
    |
    |-util 基础的工具
    |   |-ArrayList
    |   |-HashMap
    |   |-HashSet
    |   |-concurrent JUC,多线程与并发
    |   |   |-atomic 原子类
    |   |   |-locks 锁的实现
    |   |   |   |-ReadWriteLock
    |   |   |
    |   |   |-Callable 基础语法
    |   |   |-Executor
    |   |   |-ConcurrentMap 多线程基础的线程安全的集合
    |   |   |-CopyOnWriteArrayList
    |   |   |-CopyOnWriteArrayList
    |   |   |-BlockingDeque 并发
    |   |   |-BlockingQueue 并发
    |   |
    |   |-function 函数式编程的接口
    |   |-stream 与函数式编程相关的流式操作的实现
    |
    |-io 面向字节(流)的io,即普通io/阻塞式io
    |-nio 非阻塞io,buffer缓冲类,通道类,选择器,难度高
    |-math 大数以及基本的数学
    |-time 日期和时间,尤其是JDK1.8新增的日期和时间类
    |   |-LocalDate
    |   |-LocalDateTime
    |   |-LocalTime
    |
    |-net 网络通信