怎样读jdk源码

Posted 好文留给意中人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样读jdk源码相关的知识,希望对你有一定的参考价值。

搭建源码阅读调试环境


1、创建源码阅读项目

选择最普通的Java基础项目即可:


2、创建两个目录

分别为:

  • source:稍后放置JDK源码进去
  • test:放置测试代码,里面还可以按需要建立层级子目录
怎样读jdk源码


3、导入JDK源码

JDK安装目录下有一个名为src.zip压缩包,就是是JDK源码!

怎样读jdk源码

将其解压后拷贝到上面项目的source目录下,这样JDK源码就导入好了。

怎样读jdk源码

将JDK源码导一份放到这个项目里,主要原因还是方便我们在源码里阅读、调试、以及做笔记和注释。


4、调试并运行

我们可以在test目录里去随意编写一段测试代码。

比如我这里就以HashMap为例,在test目录下创建一个子目录hashmap,然后在里面创建一个测试主入口文件Test.java,随意放上一段测试代码:

public static void main( String[] args ) {
Map<String,Double> hashMap = new HashMap<>();
hashMap.put( "k1", 0.1 ); hashMap.put( "k2", 0.2 ); hashMap.put( "k3", 0.3 ); hashMap.put( "k4", 0.4 );
for ( Map.Entry<String,Double> entry : hashMap.entrySet() ) { System.out.println( entry.getKey() +":" + entry.getValue()); }
}

然后启动调试即可。



不过接下来会有几个问题需要一一去解决。


问题一:启动调试时Build报错,提示系统资源不足

怎样读jdk源码

解决方法: 加大Build process heap size。

设置方法:Preferences --> Build,Execution,Deployment --> Compiler,将默认700的数值加大,比如我这里设置为1700:

怎样读jdk源码


问题二:想从外层代码F7单步调试进入JDK源码内部,结果发现进不去

这是因为调试时,JDK源码受保护,一般单步调试不让进,但是可以设置。

解决方法::

Preferences --> Build,Execution,Deployment --> Debugger --> Stepping

怎样读jdk源码


问题三:如何对JDK源码做注释?

调试进入JDK源码以后,发现不能进行注释,每个文件上都有一个小锁的图标,这是因为现在关联的源码并不是我们项目里刚拷进去的源码,而是JDK安装目录下的src.zip只读压缩包。

解决办法: 重新关联JDK源码路径为本项目路径下的这一份JDK源码。

这样一来,就可以愉快地对JDK源码调试以及做注释了。


源码结构和阅读顺序

JDK源码毕竟太庞大了,所有都看不太现实,所以要根据日常使用和面试考察的频繁度来挖取重要的内容先看一看。

如果自己没有特别的规划,可以按照如下所示的建议阅读顺序往下进行:

具体的内容简介如下:

1、java.lang

这里面其实就是Java的基本语法,比如各种基本包装类型(Integer、Long、Double等)、基本类(Object,Class,Enum,Exception,Thread)等等...

2、java.lang.annotation

包含Java注解基本元素相关的源码

3、java.lang.reflect

包含Java反射基本元素相关的代码

4、java.util

这里面放的都是Java的基本工具,最典型和常用的就是各种容器和集合(List、Map、Set)

5、java.util.concurrent

大名鼎鼎的JUC包,里面包含了Java并发和多线程编程相关的代码

6、java.util.function +java.util.stream

包含Java函数式编程的常见接口和代码

7、java.io

包含Java传统I/O相关的源码,主要是面向字节和流的I/O

8、java.nio

包含Java非阻塞I/O相关的源码,主要是面向缓冲、通道以及选择器的I/O

9、java.time

包含Java新日期和期间相关的代码,最典型的当属LocalDateTime、DateTimeFormatter等

10、java.math

主要包含一些高精度运算的支持数据类

11、java.net

主要包含Java网络通信(典型的如:Socket通信)相关的源代码。


引自:http://dwz.win/87F


阅读源码的方式,可以参考以下两篇文章:




嫌上面操作麻烦,直接拉取github现成的

https://github.com/kangjianwei/LearningJDK



最后,附两个中文版的jdk_api,分别是1.6和1.8,前者看着舒服,后者有些辣眼。


以上是关于怎样读jdk源码的主要内容,如果未能解决你的问题,请参考以下文章

阅读JDK源码后,我有了优化它的冲动!

读JDK源码,可以边读边加注释的姿势怎么样?

源码阅读范例!终于有人把JDK源码精髓收录成册,全网开源了

太赞了!美团大牛强推JDK源码笔记,Github已星标58k

一文读懂JDK源码:ThreadPoolExecutor

JDK源码阅读之 HashMap