1.找到源码位置

其实我们安装jdk的时候源码就已经存在,只要找到jdk的安装位置,就能找到源码,如果不知道jdk具体安装位置的话,可以在idea中查看。

java 源码阅读 jdk源码阅读需要多长时间_java 源码阅读


java 源码阅读 jdk源码阅读需要多长时间_java_02

打开目录,找到路径下的src.zip,这就是jdk的源码了

java 源码阅读 jdk源码阅读需要多长时间_java_03

2.导入源码

在本地新建一个java项目,然后将src解压直接复制到新建项目目录下(PS:不要直接在idea中操作复制,要不然会很慢很卡)。

还有一个问题,如果将代码复制到项目src下面的包下,那么启动的时候会报找不到类各种异常,需要调试很长时间,直接将文件复制到项目目录下就不会有这些问题了。

java 源码阅读 jdk源码阅读需要多长时间_java 源码阅读_04

3.调试源码

在项目中随便创建一个测试类,然后打断点调试,这里我先随便写了一个list集合。

public class Test1 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
    }
}

在打断点调试的过程中,发现并没有办法进入源码的内部,我们需要再设置一下,找到setting下的debugger的stepping,将不进入源码内部关掉,保存之后再启动调试,这时候就能进入源码内部了**(PS:设置是全局的,其他项目也会这样,所以切项目的时候记得再选中)**。

java 源码阅读 jdk源码阅读需要多长时间_时间类_05

java 源码阅读 jdk源码阅读需要多长时间_java_06

如果想要在源码中加注释的话,现在是无法加注释的,需要将jdk源码改成我们自己的源码。

重新打开File-Project Structure-SDKS,将源码换成我们自己解压的地址,也可以新建一个jdk修改,新建的话要修改项目使用的jdk(这里修改也是全局的)。

java 源码阅读 jdk源码阅读需要多长时间_时间类_07

4.源码重点

这个时候就可以修改源码内容,加注释了,导入了源码就可以开始学习了,jdk中只有java目录下的源码是需要看的,但是java包下类也有很多,我们可以先看一下重点内容。

只有这几个类需要看:

java 源码阅读 jdk源码阅读需要多长时间_intellij-idea_08

4.1、java.lang(基础包)

该包提供了Java编程的基础类,例如 Object、Math、String、StringBuffer、System、Thread等

java.lang.annotation:放置元注解(需要看)

java.lang.instrment:服务监测(不需要看)

java.lang.invoke:提供了与Java虚拟机交互的低级原语(不需要看)

java.lang.management:提供提供管理接口,用于监视和管理Java虚拟机以及Java虚拟机在其上运行的操作系统(不需要看)

java.lang.ref:提供了与Java垃圾回收器密切相关的引用类(不需要看)

java.lang.reflect:这个系列使得我们可以通过反射的方式得到对象的属性或者通过反射的方式执行对象的方法(需要看)

lang包称为 java 语言包,是由编译器自动引入的。程序中不必用 import 语句就可以使用。它所包含的类和接口对所有实际的 Java 程序都是必要的。

  • object 类
  • 8种基本元素的包装类(Integer,Long,Short,Byte,Double,Float,Char,Boolean)
  • 字符串类 (String 类和 StringBuffer ,StringBuilder)
  • 数学类 (Math)
  • 线程类(Thread,Runnable)
  • 系统及运行类 (System 类和 Runtime 类 )
  • 错误和异常处理类 (Throwable 、 Exception 、 Error)
  • 过程类 (process)

4.2、java.util(工具包)

java.util.concurrent:并发包,里面包含了原子类和锁模块(需要看)

java.util.function:函数式接口(需要看)

java.util.jar:提供读写 JAR (Java ARchive) 文件格式的类

java.util.logging:提供了强大的日志输出功能

java.util.prefs:此包允许应用程序存储并检索用户和系统首选项和配置数据

java.util.regex:是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包

java.util.spi:java.util 包中类的服务提供者类

java.util.stream:它有助于为各种数据来源上的可能的并行批量操作建立简明的、声明性的表达式(需要看)

java.util.zip:提供了用于读写标准ZIP和GZIP文件格式的类

4.3、java.io(阻塞型IO)

该包通过文件系统、数据流和序列化提供系统的输入与输出

4.4、java.nio (非阻塞型IO)

计算机内存可分为2部分:

内核空间,运行OS自带的程序,比如说Windows启动程序、资源管理器、注册表等。
用户空间,运行用户程序,比如说微信,浏览器、IDEA等。

java.nio.channels

java.nio.charset

java.nio.file

NIO中的主要类:

Channel    可以将内核空间中的文件数据映射到用户空间
Buffer  缓冲,用于批量读写数据
Charset  字符集,用于字符序列的编码、解码
Selector  提供非阻塞式的IO

4.5、java.math(计算类)

提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。

BigInteger 除提供任意精度之外,它类似于 Java 的基本整数类型,因此在 BigInteger
上执行的操作不产生溢出,也不会丢失精度。除标准算法操作外,BigInteger 还提供模 (modular) 算法、GCD 计算、基本
(primality) 测试、素数生成、位处理以及一些其他操作。 BigDecimal
提供适用于货币计算和类似计算的任意精度的有符号十进制数字。BigDecimal
允许用户对舍入行为进行完全控制,并允许用户选择所有八个舍入模式。

4.6、java.time(时间类)

jdk8引入了时间类,功能强大,将日期和时间分开来。

由于老版本对于日期的计算比较困难以及api线程不安全,jdk1.8之前没有枚举类,字段中整数常量导致常量都是可变的。 为了处理
实际开发中遇到的问题,标准库随后引入了java.sql.Date作为java.util.Date的子类,但是还是没能彻底解决问题。最终JavaSE
8中引入了java.time包。

4.7、java.net(提供实现网络应用程序的类)

java.net包可以大致分为两部分:

  • 低级API ,处理以下抽象:
  • 地址 ,网络标识符,如IP地址。
  • 套接字 ,是基本的双向数据通信机制。
  • 接口 ,描述网络接口。
  • 高级API ,处理以下抽象:
  • URI ,表示通用资源标识符。
  • URL ,代表统一资源定位器。
  • Connections ,表示URL指向的资源的连接。