分享一些阅读Java相关框架源码的经验
昨天和部分网友进行了线上的交流,交流中有不少网友提到阅读源码比较难,不知道怎么上手。胖哥分享了一些个人经验,这里总结一下。
阅读源码实际上是Debug源码
其实所谓的阅读源码并不是单纯的阅读,而是调试源码。光看不动手,啥也不会有。调试源码我一般会从这几个方面着手。
样例和单元测试
很多源码都是samples样例项目以及单元测试,你可以从这些可执行的代码入手。例如Spring Authorization Server中的单元测试和样例。

这种样例和单元测试都非常容易,可以作为上手入门项目。
重视日志
日志作为了解逻辑执行的记录,每个程序员都应该知道它的重要性。线上故障排除,大多都靠日志来定位追踪,因此在看源码的时候更应该去看日志。学会看日志,重视日志不仅仅对看源码有帮助,对日常开发也很有帮助。一个优秀的开发者一定是一个优秀的日志阅读者,所以你要把看日志这个事重视起来。
目标明确
阅读的时候一定要有目标地去阅读,比如今天的阅读是为了搞清楚某个类的初始化流程,或者弄明白某个机制等等。不在这个目标之内的细节和概念都可以先放到一边,比如下面的这个片段:

我只想单纯了解这个过滤器的过滤流程,我就把它的流程标记清楚,我不会去纠结每一行的细节。细节里面还有细节,这样你就陷入了无限的细节之中了。了解整体流程了之后,再去看关键步骤的细节,比如里面的步骤②。以搞清楚步骤②为目标再去了解AuthenticationConverter的机制。然后我只看AuthenticationConverter,其它的同样不关心。如法炮制把几个步骤都搞明白,然后串起来就相当于把整个流程的细节给搞清楚了。
先看抽象再看实现
灵活的Java框架都是面向接口编程,这个接口抽象了什么一定要搞清楚,接口一般会有一个到几个方法,例如AuthenticationProvider只有两个方法:

假如我现在也不知道它干嘛的,我要搞明白它,我应该怎么入手?我是这么干的:
- 先看注释,看作者的设计意图,这个比调试重要,好的源码都有详细的注释,包括从命名上,一些词汇都能反映这个东西是干嘛的。
- 再看每个方法的入参和返回值,了解这些返回值的详细信息。
- 看谁引用了这个抽象接口。
- 最后再看看它都有哪些实现。
根据上面几个步骤了解的一些信息,打一些断点,去观察分析。
学会拆解目标
很多人上来就要研究什么Spring Bean生命周期,Spring Boot启动流程,这个太过于宏大了,不是一时半会能够掌握的。你要把这个大目标拆成很多的小目标。比如Spring Bean是如何注册的?注册前干了什么?注册后干了什么?一个一个来,分而治之,最后把它们串起来。这样不但降低了难度,而且提高了成就感。你看见别人写的一文搞定XXXX,文章是一文,可他分析的时间可不止一天,很多都是几个目标的成果汇总。
拆解目标在任何工作中都非常有用,学会了之后收益无穷。
必须总结
笔记是必须的,我没有见过不记笔记的大牛。编程这东西靠的不是死记硬背。新框架层出不穷,新概念日新月异,你脑子记得住?反正我是记不住,包括Spring Security的东西我都记不住。不过我会记笔记啊,又不是闭卷考试,用得到时候翻一翻,又回来了。这里推荐使用markdown,语法简单,排版有条理。可以说我所有的创作都是markdown。
一些调试技巧
其它的我暂时想不到,这里就分享一些IDEA调试技巧。
学会看调用帧
学会看下面这个Frames:

这个要从下往上看,这是你执行的一些代码的记录帧,你可以用鼠标选中查看每一帧的执行情况。
这有点像视频剪辑,找到关键帧去处理一些东西。
增加Watches

选中一个变量,Add to Watches,你就可以在整个流程中观察这个变量的变化情况,生命周期。多用于观察一些关键参数。
表达式操作
你还可以选中一个变量,按下Alt+F8后就可以在对话框中操作这个变量,比如获取当前的属性,别只会System.out.println!就像下面的一样:

你还可以通过它提供的方法来改变一些值,来验证你的一些推断。
总结
源码分析能力是你进阶的关键。调包每个开发都会,能够掌控自如的永远都是那些善于钻研的人。
关注公众号:Felordcn 获取更多资讯
分享一些阅读Java相关框架源码的经验的更多相关文章
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...
- 【java集合框架源码剖析系列】java源码剖析之HashMap
前言:之所以打算写java集合框架源码剖析系列博客是因为自己反思了一下阿里内推一面的失败(估计没过,因为写此博客已距阿里巴巴一面一个星期),当时面试完之后感觉自己回答的挺好的,而且据面试官最后说的这几 ...
- 【java集合框架源码剖析系列】java源码剖析之HashSet
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...
- 【java集合框架源码剖析系列】java源码剖析之TreeMap
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于TreeMap的知识. 一TreeMap的定义: public class TreeMap&l ...
- 【java集合框架源码剖析系列】java源码剖析之ArrayList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...
- 【java集合框架源码剖析系列】java源码剖析之LinkedList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...
- Java集合框架源码(二)——hashSet
注:本人的源码基于JDK1.8.0,JDK的版本可以在命令行模式下通过java -version命令查看. 在前面的博文(Java集合框架源码(一)——hashMap)中我们详细讲了HashMap的原 ...
- Java集合框架源码分析(2)LinkedList
链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...
- Java集合框架源码(一)——hashMap
注:本人的源码基于JDK1.8.0,JDK的版本可以在命令行模式下通过java -version命令查看. 一首先我们来看一下HashMap类的定义: public class HashMap< ...
随机推荐
- redis集群升级,数据迁移及校验
本次由于安全漏洞原因,需要降redis3升级为redis6,涉及到数据迁移及校验等,用阿里redis-shake迁移工具迁移,并用阿里RedisFullCheck工具进行数据比对 一.新redis安装 ...
- web虚拟主机、日志分割以及日志分析
目录 一.构建虚拟web主机 1.1 概述 1.2 支持的虚拟主机类型 1.3 部署虚拟主机步骤 1.3.1 基于域名的虚拟主机 (1)为虚拟主机提供域名解析 (2)为虚拟主机准备网页文档 (3)添加 ...
- shell基础——数组
定义数组 #小括号,空格 arr=(v1 v2 v3) arr=(`ls`) 打印数组 echo ${arr[0]} #下标从0开始 echo ${arr[*]} #整个数组 echo ${arr[@ ...
- day1 -- Python变量、注释、格式化输出字符串、input、if、while、for
1.python变量 不需要声明类型,直接 变量名 = 变量值,如 : name = "hahaha" 2.注释: 单行注释,前面加 #,如 # print(info) 多行注释 ...
- 36、python并发编程之多线程(操作篇)
目录: 一 threading模块介绍 二 开启线程的两种方式 三 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别 四 练习 五 线程相关的其他方法 六 守护线程 七 Python GIL ...
- CentOS7 部署黑客帝国代码雨
1024程序猿的节日,搞一个黑客帝国画面玩玩 [root@localhost ~]# yum -y install ncurses-devel [root@localhost ~]# yum -y i ...
- CPU优化上下文切换之线程上下文切换案例分析
对于线程上下文切换,如果同进程内就是只是线程上下文切换,如果非同进程内则是进程上下文切换.下面进行线程上下文切换场景模拟. 一.环境准备~模拟工具sysbench. 1)安装git yum -y in ...
- ASP.NET Core 6框架揭秘实例演示[08]:配置的基本编程模式
.NET的配置支持多样化的数据源,我们可以采用内存的变量.环境变量.命令行参数.以及各种格式的配置文件作为配置的数据来源.在对配置系统进行系统介绍之前,我们通过几个简单的实例演示一下如何将具有不同来源 ...
- 数据库delete from和truncate删除的区别详解
一:区别 1.delete from 后面可以直接接条件,truncate不可以 2.delete from 记录是一条条删除的,所删除的每行记录都会进入日志,而truncate一次性删除整个页,因此 ...
- 认识 LLVM
简介 LLVM是一套提供编译器基础设施的开源项目,是用 C++ 编写,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端.它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期. ...