如何阅读源码?(关键词:阅读/源码/高效)

阅读Java源码的重要性:

Java开发人员都知道,阅读源码是一个很是好的学习方式,在咱们平常工做中或多或少都会接触些开源代码, 好比说最经常使用的Struts,Hibernate,Spring,这些源码的普及与应用程度远超过咱们的想象,正由于不少人使用,也在推进着源码不断地去完善。这些优秀的源码中有着多年积淀下来的精华,这些精华是很是值得咱们学习的,无论咱们当前是什么水平,经过反复阅读源码能力能有所提高,小到对源码所提供的功能上的使用更加熟练,大到使咱们的程序设计更加完美优秀。可是,纵观咱们身边的人。可以作到通读源码的真的是少之又少,究其缘由不外乎如下几点。html

  • 阅读源码绝对算得上是一件费时费力的工做,须要读者耗费大量的时间去完成。而做为开发人员,毕竟精力有限,实在没办法拿出太多的时间放在源码的阅读上。
  • 源码的复杂性, 任何一款源码经历了多年的发展与提炼,其复杂程度可想而知。当咱们阅读源码的时候,你们都知道须要经过工具来跟踪代码的运行,进而去分析程序。可是,当代码过于复杂,环环相扣绕来绕去的时候,跟进了几十个甚至几百个函数后,这时咱们已经不知道本身所处的住置了,不得再也不重来,可是一次又一次的,最终发现本身根本没法驾取它,不得不放弃。
  • 有些源码发展多年, 会遇到各类各样的问题,并对问题进行了解决,而这些问题有的对于咱们来讲甚至能够用莫名其妙来修饰,有时候根本想不出会在什么状况下会发生。咱们选择各类查阅资料,查询无果,最终放弃。

不管基于什么样的缘由,放弃阅读源码始终不是一个明智的选择,由于你失去了一个跟大师学习的机会。并且,当你读过几个源码以后你会发现,他们的思想以及实现方式是想通的。这就是开源的好处。随着各类开源软件的发展。各家都会融合别家优秀之处来不断完善本身。这样,到最后的结果就是全部的开源软件从设计上或者实现上都会变得愈来愈类似,也就是说当你读完某个优秀源码后再去读另外一个源代码, 速度会有很大提高。程序员

以我为例,Spring 是我阅读的第一个源码,几乎耗尽了我将近半年的时间,其中各类煎熬可想而知,可是当我读完Spring再去读MyBatis只用了两周时间。固然,暂且不论它们的复杂程度不一样,至少我阅读的时候发现有不少相通的东西。当你第一次阅读的时候,你的重点必定是在源码的理解上,可是,当你读完第一个源码再去读下一个的时候,你天然而然地会带着批判或者说挑剔的眼光去阅读:web

  • 为何这个功能在我以前看的源码中是那样实现的,而在这里会是这样实现的?
  • 这其中的道理在哪里,哪一种实现方式更优秀呢?

而经过这样的对比及探索,你会发现,本身的进步快得不可思议。面试

阅读Java源码的前提条件:

一、技术基础

在阅读源码以前,咱们要有必定程度的技术基础的支持。算法

假如你历来都没有学过Java,也没有其它编程语言的基础,上来就啃《Core Java》,那样是很难有收获的,尤为是《深刻Java虚拟机》这类书,或许别人以为好,可是未必适合如今的你。spring

好比设计模式,许多Java源码当中都会涉及到。再好比阅读Spring源码的时候,势必要先对IOC,AOP,Java动态代理等知识点有所了解。shell

二、强烈的求知欲

强烈的求知欲是阅读源码的核心动力!数据库

大多数程序员的学习态度分为以下几个层次:编程

  1. 完成本身的项目就能够了,遇到不懂的地方就百度一下。设计模式

  2. 不只作好项目,还会去阅读一些和项目有关的书籍。

  3. 除了阅读和项目相关的书籍以外,还会阅读一些IT行业相关的书籍。

  4. 平时会常常逛逛GitHub,找一些开源项目看看。

  5. 阅读基础框架、J2EE规范、源码。

大多数程序员的层次都是在第一层,到第五层的人就须要有强烈的求知欲了。

三、足够的耐心

经过阅读源码咱们能够学习大佬的设计思路,技巧。还能够把咱们一些零碎的知识点整合起来,从而融会贯通。总之阅读源码的好处多多,想必你们也清楚。

可是真的把那么庞大复杂的代码放到你的眼前时,确定会在阅读的过程当中卡住,就如同陷入了一个巨大的迷宫,若是想要在这个巨大的迷宫中找到一条出路,那就须要把整个迷宫的总体结构弄清楚,好比:API结构、框架的设计图。并且还有理解它的核心思想,确实很不容易。 

刚开始阅读源码的时候确定会很痛苦,因此,没有足够的耐心是万万不行的。

如何读Java源码:

我也是经历过阅读源码种种痛苦的人,算是有一些成功的经验吧,今天来给你们分享一下。 

若是你已经有了一年左右的Java开发经验的话,那么你就有阅读Java源码的技术基础了。

一、建议从JDK源码开始读起,这个直接和eclipse集成,不须要任何配置。

能够从JDK的工具包开始,也就是咱们学的《数据结构和算法》Java版,如List接口和ArrayList、LinkedList实现,HashMap和TreeMap等。这些数据结构里也涉及到排序等算法,一箭双雕。

面试时,考官总喜欢问ArrayList和Vector的区别,你花10分钟读读源码,估计一生都忘不了。

而后是core包,也就是String、StringBuffer等。 若是你有必定的Java IO基础,那么不妨读读FileReader等类。

建议你们看看《Java In A Nutshell》,里面有整个Java IO的架构图。Java IO类库,若是不理解其各接口和继承关系,则阅读始终是一头雾水。

Java IO 包,我认为是对继承和接口运用得最优雅的案例。若是你未来作架构师,你必定会常常和它打交道,如项目中部署和配置相关的核心类开发。

读这些源码时,只须要读懂一些核心类便可,如和ArrayList相似的二三十个类,对于每个类,也不必定要每一个方法都读懂。像String有些方法已经到虚拟机层了(native方法),如hashCode方法。

固然,若是有兴趣,能够对照看看JRockit的源码,同一套API,两种实现,颇有意思的。

若是你再想钻的话,不妨看看针对虚拟机的那套代码,如System ClassLoader的原理,它不在JDK包里,JDK是基于它的。JDK的源码Zip包只有10来M,它像是有50来M,Sun公司有下载的,不过很隐秘。我曾经为本身找到、读过它很兴奋了一阵。

二、Java Web项目源码阅读

步骤:表结构 → web.xml → mvc → db → spring ioc → log→ 代码

① 先了解项目数据库的表结构,这个方面是最容易忘记的,有时候咱们只顾着看每个方法是怎么进行的,却没有去了解数据库之间的主外键关联。其实若是先了解数据库表结构,再去看一个方法的实现会更加容易。

② 而后须要过一遍web.xml,知道项目中用到了什么拦截器,监听器,过滤器,拥有哪些配置文件。若是是拦截器,通常负责过滤请求,进行AOP等;若是是监听器,多是定时任务,初始化任务;配置文件有如 使用了spring后的读取mvc相关,db相关,service相关,aop相关的文件。

③ 查看拦截器,监听器代码,知道拦截了什么请求,这个类完成了怎样的工做。有的人就是由于缺乏了这一步,本身写了一个action,配置文件也没有写错,可是却怎么调试也没法进入这个action,直到别人告诉他,请求被拦截了。

④ 接下来,看配置文件,首先必定是mvc相关的,如springmvc中,要请求哪些请求是静态资源,使用了哪些view策略,controller注解放在哪一个包下等。而后是db相关配置文件,看使用了什么数据库,使用了什么orm框架,是否开启了二级缓存,使用哪一种产品做为二级缓存,事务管理的处理,须要扫描的实体类放在什么位置。最后是spring核心的ioc功能相关的配置文件,知道接口与具体类的注入大体是怎样的。固然还有一些如apectj等的配置文件,也是在这个步骤中完成。

⑤ log相关文件,日志的各个级别是如何处理的,在哪些地方使用了log记录日志。

⑥ 从上面几点后知道了整个开源项目的总体框架,阅读每一个方法就再也不那么难了。

⑦ 固然若是有项目配套的开发文档也是要阅读的。

三、Java框架源码阅读

固然了,就是Spring、MyBatis这类框架。

在读Spring源码前,必定要先看看《J2EE Design and Development》这本书,它是Spring的设计思路。注意,不是中文版,中文版彻底被糟蹋了。

想要阅读MyBatis的源码就要先了解它的一些概念,不然云里来雾里去的什么也不懂。有不少人会选择去买一些书籍来帮助阅读,固然这是可取的。那么若是不想的话,就能够去官网查看它的介绍(MyBatis网站:http://www.mybatis.org/mybatis-3/zh/getting-started.html),团长也是按照官网上面的介绍来进行源码阅读的。团长认为MyBatis的亮点就是管理SQL语句。

总结

没有人一开始就能够看得懂那些源码,咱们都是从0开始的,并且没有什么捷径可寻,无非就是看咱们谁愿意花时间去研究,谁的求知欲更强烈,谁更有耐心。阅读源码的过程当中咱们的能力确定会提高,能够从中学到不少东西。在咱们作项目的时候就会体现出来了,的确会比之前顺手不少。

相关文章
相关标签/搜索