为什么要学习JDK源码

作为Java程序员,JDK源码的作用就像"道生一,一生二,二生三,三生万物"。源码是大师们的智慧的结晶,我们所要做的是就是站在巨人的肩膀之上,在技术之路上成长、提高,也将编码做成一门艺术。当然了,实际的角度而言,由于当前软件业的发展,有限的岗位和大量程序员导致我们在面试时经常被询问JDK源码的理解。JDK源码是个浩繁的工程,我们只能一点一点去挖掘,并时刻标记上自己挖掘的心得体会,所以作者在参考了其他博主的笔记之后,也搭建如此环境并记录下来并同步到自己的gitee上。

学习环境准备

  1. JDK8.
  2. Intellij IDEA 2021.1
  3. apache-maven-3.8.1
  4. win10操作系统

源码学习环境搭建

1. 在idea中新建一个maven项目,取名叫jdk-source-learning。

如何源码跑Java项目 java源码怎么搭建_java

2. pom文件中引入junit4 maven依赖,作为后续测试源码时写单元测试使用。

<dependency>
            <!--引入junit单元测试框架-->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

3. 打开自己的JDK安装目录,找到source.zip文件,这个即是源码,解压缩后复制粘贴到我们的maven工程里的java目录下,直接拷贝进IDEA中会有问题,我们直接拷贝到源目录下

如何源码跑Java项目 java源码怎么搭建_Test_02

如何源码跑Java项目 java源码怎么搭建_Java_03

4. 增大Build process heap size。

File->Settings->Build,Execution,Deployment->Complier,然后设置process heap size为1700,默认是700.

如何源码跑Java项目 java源码怎么搭建_Java_04

5. 设置单步调试。

File->Settings->Build,Execution,Deployment->Debugger->Stepping

如何源码跑Java项目 java源码怎么搭建_java_05

6. 重新关联JDK源码,允许我们在调试我们导入的JDK源码进行注释操作。

File->Project Structure->Platform Settings->SDKs->Sourcepath

默认配置如下:

如何源码跑Java项目 java源码怎么搭建_Java_06

我们移除默认SDKs,然后添加入我们源码目录。

如何源码跑Java项目 java源码怎么搭建_如何源码跑Java项目_07

7. 导入tools.jar。

File->Project Structure->Libraries

如何源码跑Java项目 java源码怎么搭建_Test_08

8. 从OpenJDK把UNIXToolKit、FontConfigManager给放置到java目录下新建的sun.awtsun.font目录对应的目录下。

如何源码跑Java项目 java源码怎么搭建_Java_09

如何源码跑Java项目 java源码怎么搭建_如何源码跑Java项目_10

如何源码跑Java项目 java源码怎么搭建_Java_11

源码参考阅读顺序。

  • java.lang :Java的基本语法。
  • java.lang.annotation: Java注解。
  • java.lang.reflect:Java反射。
  • java.util:Java工具类。
  • java.util.concurrent:并发包。
  • java.util.function +java.util.stream:函数编程和流编程。
  • java.io + java.nio:Java IO、NIO的读写。
  • java.net:Java网络编程

单元测试代码

我们在test目录下给String类的转换为大写的方法写个单元测试,并且进行Debug调试等。

如何源码跑Java项目 java源码怎么搭建_Test_12

package com.tgy.java.lang;

import org.junit.Assert;
import org.junit.Test;


public class StringTest {

    @Test
    public void toUpperCase() {
        String str="hello,jack!";
        String upperCase = str.toUpperCase();
        Assert.assertTrue("HELLO,JACK!".equals(upperCase));
    }
}

如何源码跑Java项目 java源码怎么搭建_java_13