昨天和部分网友进行了线上的交流,交流中有不少网友提到阅读源码比较难,不知道怎么上手。胖哥分享了一些个人经验,这里总结一下。

阅读源码实际上是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 获取更多资讯

个人博客:https://felord.cn

最新文章

  1. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
  2. 修改.gitignore后让其生效
  3. Vue.js 动态绑定class
  4. 让C程序更高效的10种方法(转)
  5. Netsharp介绍
  6. Git 安装与简单使用(新手必看)
  7. Java Servlet 工作原理问答
  8. Angularjs在线api文档
  9. [学习心得][Introduction to ASP.NET Core 1.0]3-2 ASP.NET Core and MVC Pattern
  10. layui 表格内容显示更改
  11. Qt学习--信号与槽(多窗口的实现)
  12. R实用小技巧
  13. chmod chown
  14. linux下GCC编译文件
  15. SQLite中的SELECT子句使用通配符
  16. caffe slover文件详解
  17. setting.xml配置文件 --转载
  18. 问答项目---登陆也要做验证!(JS和PHP验证)
  19. java中Mysql开发
  20. trk压力测试工具(测试tcp)

热门文章

  1. Spring中@Autowired 注解的注入规则
  2. Java中Integer 和 int的区别
  3. 手把手教你实现pynq-z2条形码识别
  4. 5、Linux基础--etc(文件系统)、启动模式、单用户模式修改密码、安装目录、日志目录、状态目录
  5. Solution -「洛谷 P4198」楼房重建
  6. BigDecimalAvoidDoubleConstructorRule:不要直接用double变量作为构造BigDecimal的参数
  7. AQS源码二探-JUC系列
  8. ensp练习:防火墙安全策略配置
  9. 大家好 这里是yi术家
  10. Centos7 增加swap分区的内存大小