阅读JDK源码

搭建源码阅读调试环境

  单独搞一个Java工程,源码放里面,测试代码也放里面,集中调试,集中看代码,集中写注释比较方便一些

1、创建源码阅读项目

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

2、创建两个目录

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

 

 

 

 

3、导入JDK源码

    

     在jdk安装目录下找到src.zip,将其解压后拷贝到上面项目的source目录下,这样JDK源码就导入好了。

    

 

 

     这里删去com.sun文件夹,里面有依赖包显示无法找到,不删掉后面调试会报错,而且我们暂时还不会去读这个文件夹里面的源码。

  4、调试并运行

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

    这里就以HashMap为例,在test目录下创建一个HashMapTest.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报错,提示系统资源不足

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

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

 

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

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

    解决方法::

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

    

 

 

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

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

    解决办法: 重新关联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通信)相关的源代码。

 


 

  参照了 原文链接:https://blog.csdn.net/wangshuaiwsws95/article/details/105112518

posted @ 2021-02-26 13:17  宇宙过河卒  阅读(643)  评论(0)    收藏  举报