一、JDK源码的重要性
JDK源码的重要性不言而喻,平时的面试、深入学习等都离不开JDK的源码。当然,JDK源码是非常优秀的代码,我们之所以阅读JDK源码,就是为了理解底层原理、学习优秀的设计模式和思想。不过JDK源码也是相当难啃的知识点,我们一定要有信心,不要畏难,硬着头皮去学习,一定会有很大的收获的。
二、搭建JDK源码阅读项目
1、新建项目并导入JDK源码
首先新建一个普通的Java项目,笔者这里将项目取名为jdkSourceLearn,大家可自行选择。
![8355b9b762e09de4d8b249d20ffd1164.png](https://i-blog.csdnimg.cn/blog_migrate/6e41af37b9ed0bbd07637ebf9786e964.jpeg)
![b7ad4bf5dd16b8d69e556d338984de35.png](https://i-blog.csdnimg.cn/blog_migrate/ca5648028b0b725276fc40893c94da28.jpeg)
建议大家新建两个目录,一个叫source,放置JDK源码;一个叫test,放置测试用例。这样层次结构较为清晰,方面学习。
![5be33acb524083b24c66bafbba7b92d6.png](https://i-blog.csdnimg.cn/blog_migrate/008c33872708d2fd22d10ca3778ce6bf.png)
现在导入JDK源码,找到安装JDK的目录,里面有个叫src.zip的文件,那个就是源码的压缩文件。将其解压完毕后直接拷贝到项目的source目录下即可。
![ba847191bd4549bca99065dcdf555ae0.png](https://i-blog.csdnimg.cn/blog_migrate/01ad0fbaf7614bbe6932e952075e7639.png)
![391d07abc976c90d2efbc32c332e5378.png](https://i-blog.csdnimg.cn/blog_migrate/1e9d6ce818d746f6a7ccbb28948f06f0.png)
2、创建测试用例尝试调试
这里在test目录下创建一个相关测试用例并尝试进行调试。
package cn.mambalhb.test;
import java.util.HashMap;
import java.util.Set;
public class HashMapTest {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("aaa", "AAA");
map.put("bbb", "BBB");
map.put("ccc", "CCC");
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key + "===>" + map.get(key));
}
}
}
设置断点并点击调试后,通常需要等待项目Build一会,这个时候会出现一堆错误,下面来一个一个解决。
3、解决相关问题
(1)系统资源不足
问题提示如下:
![e3a8db917fe25da91d91ad4dda910f6e.png](https://i-blog.csdnimg.cn/blog_migrate/bca17e2387e54538063c6716d88d31db.jpeg)
通过提示可以看出导致这个错误出现的原因是内存不够。解决办法当然是加大内存。 点击File-->Settings-->Build,Execution,Deployment-->Compiler,将Build process heap size(Mbytes)选项加大,默认值是700,笔者这里调至1200:
![879dd3e2c1b0dd39b74a975a34e1df75.png](https://i-blog.csdnimg.cn/blog_migrate/9590db9f5b8a0e0d238e0205a558e799.jpeg)
(2)程序包com.sun.tools.javac.*不存在
问题提示如下:
![1a1bea3158ccf3e633ce6e366cb1ef63.png](https://i-blog.csdnimg.cn/blog_migrate/b9d0493689e1014ef04a2cc2614c285f.jpeg)
这是缺少tools的jar包所导致的。 点击File-->Project Structure-->Libraries
![9c918c9cd77d0168c1b78076c07a0d7c.png](https://i-blog.csdnimg.cn/blog_migrate/e628cea240b2664035f53c32956533f9.jpeg)
选择JDK安装目录,在lib目录下找到tools.jar,点击ok导入即可。
![191a6b4a99aaada03d92c6b9afae0592.png](https://i-blog.csdnimg.cn/blog_migrate/da8529614800bbeec1bf949ca45fd703.jpeg)
(3)找不到符号UNIXToolkit、FontConfigManager
问题提示如下:
![d835ae6179f5b4def59660a8758230b8.png](https://i-blog.csdnimg.cn/blog_migrate/40368ada02527cd1f00ce446a7460f05.png)
![b489335f558a093911ccbe2513e38a6f.png](https://i-blog.csdnimg.cn/blog_migrate/9073be95e7fd0178aa0b2251f8f4a961.png)
这是因为在Windows平台下缺少了两个java类文件所导致的。 这两个类文件可在OpenJDK网站上找到。
![5bcdeebda6958c69fa222839a828721e.png](https://i-blog.csdnimg.cn/blog_migrate/b70d05a503a0db871a97eda19b61deec.jpeg)
注意这里选择自己相应的JDK版本,笔者的是jdk1.8.0_162。
![5b4bb37d1eda06f483d7e1049bd224e1.png](https://i-blog.csdnimg.cn/blog_migrate/601b063a6b20d18531a85c811ffdfd76.jpeg)
![c897f951acf354c9dd541770ff18ff02.png](https://i-blog.csdnimg.cn/blog_migrate/855363d92f3a0da895dd4b94ab3e99bd.jpeg)
![fa64609b2de500370e7fed608e380b9a.png](https://i-blog.csdnimg.cn/blog_migrate/33caa789e17289bdb20a51ab86cec7cd.jpeg)
![493c661fbaf40c1fcb5b3d35ae09f4f7.png](https://i-blog.csdnimg.cn/blog_migrate/a90d3b57cbfbef7e34279b20f0b36a25.jpeg)
![c7af5ac50a654e8486f8c1d3f0881f0d.png](https://i-blog.csdnimg.cn/blog_migrate/9a090ff27ea500d3a3a08c126649afd2.png)
![c7f87a255a311708c0e9badfce00f47a.png](https://i-blog.csdnimg.cn/blog_migrate/05cec4adead5fd852ad2e9698eedc98e.jpeg)
![2f921472a40ceab2d9b61429ff8ec47b.png](https://i-blog.csdnimg.cn/blog_migrate/0f88e8e9c146e955fbb5f6d1114a66d2.jpeg)
![ee37a196c14a3d091ed184c9cfc3d05d.png](https://i-blog.csdnimg.cn/blog_migrate/1f1bf56a6d7203d2e37bfc20de56aeb2.jpeg)
![5098dbd2905ff7f55a803a994cf331bb.png](https://i-blog.csdnimg.cn/blog_migrate/73244d34ecf226a4b4248b018101a055.jpeg)
![b7ca7b7b830ce965bcaf31d564fb226d.png](https://i-blog.csdnimg.cn/blog_migrate/98c554a6118c9a3789aafe0e0ab4b8f4.jpeg)
找到这两个类文件的位置后,将它们复制进项目如下图所示的位置中。
![adb9035281a457bd7d605f4de32a8eba.png](https://i-blog.csdnimg.cn/blog_migrate/9a79238de7effbaafe1361aac89fd4f4.png)
此时再调试或者运行测试用例的时候,可以看到已经成功运行。
![0d083ba671f6c2d8f265d7c0f23a91de.png](https://i-blog.csdnimg.cn/blog_migrate/739cbd238d184d1970b871391b2ef279.jpeg)
三、完善项目设置
1、允许调试进入
此时如果我们打断点进行单步调试的话,可以发现点击Step Into无法进入源码内部,因为JDK源码的受保护的,无法进入,但是点击Force Step Into是可以进入源码内部的。如果想要直接按F7(即点击Step Into)进入源码内部的话,需要做如下设置: 点击File-->Settings-->Build,Execution,Deployment-->Debugger-->Stepping,取消勾选Do not step into the classes。
![014ab7205d949aec2cd195b20be16501.png](https://i-blog.csdnimg.cn/blog_migrate/648cb99ef492cea779a1d026b2696ae9.jpeg)
2、编辑源码文件
如果我们想要对源码文件做记录或者注释时,会发现源码文件是只读的,无法编辑。因为此时项目关联的源码文件还不是刚才复制进项目的文件,而是jdk安装目录下的源码文件。重新将项目关联的源码文件设置成该项目下的源码文件即可。 点击File-->Project Structure-->SDKs
![019b3b1681091c19c2cfd36d8db1720d.png](https://i-blog.csdnimg.cn/blog_migrate/6ee6ee8d8665ec6d85be691814dfebb2.jpeg)
这里将原先的jdk安装目录下关联的源码路径删除,添加刚才拷贝至项目目录下的源码路径。
![adba0436a390987fb55fafe5e067cc3e.png](https://i-blog.csdnimg.cn/blog_migrate/7716b436b9219df5b90fb0be33ca2d1f.jpeg)
这个时候,再进行调试进入源码内部的时候,可以发现,文件上面的小锁标志已经不见了,源码文件也可以进行注释记录了。
![d197b923d47da259738c0e7352df7c12.png](https://i-blog.csdnimg.cn/blog_migrate/b209b224c962332b50c090d901665105.jpeg)
四、总结
至此,关于JDK源码阅读项目的搭建已经完成。平时学习源码的时候,不能只是光看,一定要动手调试,在调试的过程中阅读源码,做记录,写注释,缺一不可。将输入转化为输出,坚持下去。