怎么阅读源码【调试观察源码】

简介: 怎么阅读源码【调试观察源码】

✿ 需要掌握的编译器知识

★ 编译器为eclipse为例子

  • 调试准备工作(步骤:Window -> Show View -》...):
    □ 打开调试断点Breakpoint:

43.png


□ 打开变量监视:


44.png


  • 要看一个方法的内部细节,按f5,进入
    45.png
  • 放行操作,可以快速跳到下一个断点的位置【在目标位置上打个断点】,然后按f8
    46.png
  • 观察方法的细节(执行流程),一步一步走,按f6
    47.png
  • 去除掉所有断点(编译器是eclipse)
    48.png
    □ 注意看开始标记的执行位置对不对
    49.png
  • f5调试的方式进入【若进入的是不相干的,按f7返回,再按f5进入一次
    举例:
User user = mapper.get(1L); //在这里打一个断点进入,会先进入Long类,因为执行顺序是(1L)先执行呀,所以先进入它之后,再执行get方法
  • 按ctr 和 按调试的f5的区别:
    □ ctr:是进入“被选中的代码(类、接口、方法)”的定义的位置【强调点是代码的定义
    □ f5:是对于当前代码按执行的先后顺序进行执行,进入、执行它的内部【强调点是代码的执行
  • 按ctr 结合鼠标, 可以知道代码下一步的去向(按ctr要注意的细节:ctr默认进入的是被选中的代码的定义,不是实现过程,进入之后发现没看到什么有帮助理解的代码,返回返回按住ctr,选择实现(若是有多个实现,不知道选哪个,可以通过调试f5进入),再按鼠标进入。

    0.png1.png



  • 重新开始调试细节:
    (1)关闭上一次调试
    (2)点击 开始调试之前,保留开始位置的断点前面的√,其他断点前面的√先去掉(开始调试之后才√回来)
    2.png


  • 进入一个方法后了解到方法的细节,想返回接着往下执行,按f7 返回 【返回按f7
    一般在深入了解某个模块之后,可以按返回,返回。。。然后接着了解下一个模块
    3.png




✿ 读源码的思路

1、重点理解执行逻辑(执行过程可以按control进入方法或类,理解下一步去向后,光标回到当前位置【快捷键是alt+←】)

2、看源码过程理清思路,异常相关的(error、exception、throw),让代码更加健硕的细节可以忽略;栈相关的stack,底层的可以忽略

3、在代码中,看到选择分支的话,可以观察变量的值(判断条件)知道要进入哪个分支

4、在代码中,看到不理解的代码,可以先往下执行,然后通过观察变量的值进行理解【还可结合官网进行理解】

5、读取流、加载资源、绑定命名空间、参数转化不是重点

6、构造构造器不是重点,重点是看 构造器的构造过程

7、构造解析器不是重点,重点是看 解析器的解析过程

8、创建了子类要注意:什么类型的子类?当子类有封装的父类或兄弟类时候,注意封装的父类或兄弟类是什么类型的?




✿ 读源码如何抓重点的思路(以mybatis的源码为例)

■ 1、 阅读源码的过程,应该阅读哪一个,哪一个是阅读重点呢?

  • 阅读源码构建会话工厂对象的源码,咱了解到:创建了一个SqlSessoinFactory会话工厂对象是通过默认的SqlSessoinFactory创建的,在创建的时候需要传入一个配置对象【即创建会话工厂对象的时候还创建了一个配置对象】,至此,研究一下配置对象的创建过程。
    4.png


  • 阅读源码构建会话工厂对象的源码,咱了解到:创建一个sqlSession会话对象是通过默认的sqlSession,在创建的时候需要传入三个参数,重点是观察哪个呢?

□ configuration 配置对象(在阅读会话工厂对象构建的源码的时候咱就了解过它了,不是重点)

□ executor 执行器(重点,因为在return 会话对象之前构建了executor执行器

□ autoCommit (是否提交,布尔值,不是重点)

5.png

  • 结合理解逻辑,还有return的提示作用,知道阅读重点是list的过程
    6.png




✿ 阅读源码需要掌握的单词

  • map 映射       mapper 映射器
  • factory 工厂
  • build 构建
  • config 配置
  • parse 解析     parser 解析器      parsed 已解析的      parseConfiguration 解析配置
  • interceptor 拦截器
  • plugin “安装[增强]”、插件
  • proxy 代理
  • prepared 预编译的 callable 存储的
  • statment 语句对象      preparedStatement 预编译语句对象     callableStatement 存储的语句对象
  • cursor 光标
  • instantiate 实例化      instantiateStatement 实例化语句对象
  • handler 处理器      typeHandler 类型处理器
  • row 行
目录
相关文章
|
芯片
自带恒压恒流环路的降压型单片车充专用芯片
一、基本概述 XL2009是一款高效降压型DC-DC转换器,固定180KHz开关频率,可以提供最高2.5A输出电流能力,具有低纹波,出色的线性调整率与负载调整率特点。XL2009内置固定频率振荡器与频率补偿电路,简化了电路设计。 PWM 控 制 环 路 可 以 调 节 占 空 比 从0~100%之间线性变化。内置过电流保护功能,当 输 出 短 路 时 , 操 作 频 率 由 180KHz 降 至48KHz。内部补偿模块可以减少外围元器件数量。 二、产品特点 8V到36V宽输入电压范围 输出1.25V到32V可调 最大占空比100% 最小压降0.3V 固定180KHz开关频率
130 0
|
计算机视觉
数据集学习笔记(三):COCO创建dataloader用于训练
如何使用COCO数据集创建dataloader进行训练,包括安装环境、加载数据集代码、定义数据转换、创建数据集对象以及创建dataloader。
302 5
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
240 4
|
8月前
|
数据库连接 PHP 数据库
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
|
移动开发 API
阿里云优惠口令(2023更新)
阿里云优惠口令(2023更新)2023年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,com域名注册优惠口令“梦想从域名开始”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码
330 0
|
算法
【图像】图像增强-降噪锐化
【图像】图像增强-降噪锐化
157 1
|
存储 Java 测试技术
滚雪球学Java(57):解密Java中List接口底层实现原理
【6月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
142 2
滚雪球学Java(57):解密Java中List接口底层实现原理
|
存储 安全 编译器
C/C中sizeof和strlen函数的实现:详细解析sizeof和strlen函数的实现机制、参数说明和使用技巧
C/C中sizeof和strlen函数的实现:详细解析sizeof和strlen函数的实现机制、参数说明和使用技巧
322 1
|
Java 数据挖掘 关系型数据库
软件测试——性能测试2
软件测试——性能测试
195 0
|
存储 Java
数据结构之顺序存储结构和链式存储结构分析 , 图文并茂 , 又涨姿势了
单链表/双向链表头插/头删时间复杂度 : O(1) 单链表/双向链表中间插入/删除时间复杂度 : O(N) 循环链表插入/删除时间复杂度 : O(N) 单链表/双向链表/循环链表获取数据时间复杂度 : O(N) 数组头插/头删时间复杂度 : O(N) 数组尾删/尾插时间复杂度 : O(1) 数组中间插入/删除时间复杂度 : O(N) 数组/动态数组根据下标随机访问时间复杂度 : O(1)
3229 0