JDK源码阅读环境搭建

news/2024/7/24 12:52:19 标签: java

本次针对jdk8u版本的搭建

1.新建项目

新建java项目JavaSourceLearn ,这里我创建的是maven

image-20230520090429984

2.获取JDK源码

打开Project Structure

image-20230520085654043

找到本地JDK安装位置将src.zip解压到项目java包中

image-20230520085713356

整理下项目结构,删除用不到的目录

image-20230520090526428

提示: 添加源码到项目之后首次运行需要较长时间进行编译,建议先设置好进程堆,防止编译失败

3.构建进程堆大小

打开File -> Settings -> Build, Execution, Deployment -> Compiler

设置Build process heap size (Mbytes)

image-20230520090849390

4.调试设置

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

取消Do not step into the classes

image-20230520090923817

说明: 该设置勾选后会在Debug时不进入到相关类路径下的方法内

5. 设置源码路径

为了能够注释以及避免修改到其他项目所使用的内容,

1.添加一个名为“JavaSourceLearn1.8”的SDK

2.并将Sourcepath修改为当前项目src下的源码内容(新增)

3.移除Sourcepath中关联的src.zip(删除)

image-20230520091811390

修改项目使用的JDK为新建的JavaSourceLearn1.8

image-20230520092337761

说明: 原先JDK源码包为锁定状态,Debug进入源码后无法修改/添加注释 ,这样就可以添加注释了

6. 解决报错问题

找不到UNIXToolkit和FontConfigManager

这是因为在Windows平台下缺少了这2个java类文件所导致的。

这2个类文件可在OpenJDK网站上找到,地址:http://openjdk.java.net/,打开后点Mercurial,点jdk8u,点jdk,点browse,点src,点solaris,点classes,点sun,可以找到2个文件夹,awt和font,缺少的2个文件分别在这2个文件夹下

image-20230520092407165

image-20230520092412349

按照下图所示目录结构,新建同样名字的目录和空内容的文件

打开openJDK上同样名字的java文件,把对应的内容复制到IDEA

javac_78">程序包com.sun.tools.javac.*不存在

这是缺少tools的jar包所导致的。

点击File–>Project Structure–>SDKs,手动把jdk8的tools.jar包添加到JavaSourceLearn1.8,

image-20230520092648828

这些都解决了,重新build发现还是有错误

GTKLookAndFeel类依然报红

image-20230520092803462

百度了一下也没有找到原因,觉得这是和Unit平台相关的判断,应该问题不大,注释掉启动果然OK

7.代码换行注释后, debug 错行的问题

之后在这里的源码中换行注释,打断点 debug 会出现错行的问题,并且无法显示局部变量,提示 source code does not match bytecode。

image-20230520093237785

临时解决方案:E:\workspace\JavaSourceLearn\target\classes为当前项目编译后classes的路径

让BootStrapClassLoader优先加载我们的类

-Xbootclasspath/p:"E:\workspace\JavaSourceLearn\target\classes"

在测试类中配置VM options

image-20230520094137158

image-20230520093349336

这样就不受注释的影响了,这样每次都要配置,可以配置一个模板,每次创建都自动指定

image-20230520094217813

image-20230520094253673

新建测试

java">/**
 * @author Dongguo
 * @date 2021/8/20 0020-9:47
 * @description:
 */
class MyTest {
    @Test
    public void test1() {
        String array[] = {"hello", "world", "java"};
        List<String> list = new ArrayList<String>(Arrays.asList(array));
        list.add("zhangsan");
        System.out.println(list);
        list.remove("zhangsan");
        System.out.println(list);
    }
}

启动调试,F7调试进入源码内部

image-20230520114200277

此时进入到我们自己搭建的源码阅读环境中。并且可以在源码中添加自己的注释。

github

如果文章有问题请留言。


http://www.niftyadmin.cn/n/341598.html

相关文章

Flutter控件之图片Image封装

Flutter控件之基类Widget封装 Flutter控件之文本Text封装 为什么要进行繁琐的封装&#xff1f;直接用也挺好啊&#xff0c;这个回答一点毛病没有&#xff0c;大部分视图都可以原生绘制&#xff0c;可在Flutter中偏偏原生的控件&#xff0c;少了很多需要又常用的属性&#xff…

OPEN AI角色插件通道开放接入支持各种细分领域对话场景模型一键接入AI 智能

相信还是有很多伙伴不了解OPEN AI平台 &#xff0c;这里在细说一下 大家知道ChatGPT, 或者百度文心一言 阿里通意千问 包括各种其他的AI 聊天或者画图&#xff0c;等应用层出不穷。 但是我们要自己实现自己 语言大模型&#xff0c;或者说是人工智能应用能不能。 有实力当然可…

Redis+LUA脚本实现限流

文章目录 1、demo结构2、自定义接口3、编写写LUA脚本4、通过AOP切面识别需要限流的接口编写切面AOP通知类型 5、Redis限流自定义异常构建Redis限流自定义异常声明这个类为全局异常处理器专属日志 6、流量限制器RateLimiterRateLimitAlgApiLimitRateLimitRuleRuleConfig 7、Guav…

无效数据是什么,我们该怎么处理?

文章目录 一、介绍无效数据的概念1.1 概念和类别1.2 造成的影响1.3 如何识别 二、无效数据的处理方法2.1 阐述如何进行数据验证2.2 数据清洗的概念和方法2.3 好用的数据清洗工具2.4 无效数据处理的挑战和注意事项 三、如何减少无效数据3.1 阐述减少无效数据的方法 四、实际案例…

0基础转行居然拿到9.5K!尘埃深处是繁花,强者从未停下!

人总是越长大越胆小&#xff0c;很多事情不敢做&#xff0c;以后就更不敢做了。 为梦想颠簸的人有很多&#xff0c;可能不差你这个&#xff0c;不如意的时候我们都会想要放弃&#xff0c;但是生活不是一个点&#xff0c;它是一条长长的线&#xff0c;唯有行动&#xff0c;才能摆…

测试开发备战秋招面试11-牛客刷题之哈希

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧&#xff01; 目录 1、两数之和 2、数组中出现次数超过一半的数字 3…

【5.20】四、性能测试—性能测试工具

目录 4.5 性能测试工具 4.5.1 LoadRunner 4.5.2 JMeter 4.5 性能测试工具 性能测试是软件测试中一个很重要的分支&#xff0c;人们为了提高性能测试的效率&#xff0c;开发出了很多性能测试工具。一款好的测试工具可以极大地提高测试效率&#xff0c;为发现软件缺陷提供重要…

探索LeetCode【0011】盛最多水的容器(已懂)

目录 0. 题目1. 官方解答一&#xff08;已懂&#xff09;2. 精简解答二&#xff08;已懂&#xff09;3. 正确性解释 0. 题目 题目链接&#xff1a;【0011】盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i,…