转载java源代码阅读方法

刚才在论坛不经意间,看到有关源码阅读的帖子。回想本身前几年,阅读源码那种兴奋和成就感(1),不由又有一种激动。
源码阅读,我以为最核心有三点:技术基础+强烈的求知欲+耐心。

说到技术基础,我打个比方吧,若是你历来没有学过Java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸取到养分的,特别是《深刻Java虚拟机》这类书,别人以为好,未必适合如今的你。
虽然Tomcat的源码很漂亮,但我毫不建议你一开始就读它。我文中会专门谈到这个,暂时不展开。

强烈的求知欲,我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦):
一、只关注项目自己,不懂就baidu一下。
二、除了作好项目,还会阅读和项目有关的技术书籍,看wikipedia。
三、除了阅读和项目相关的书外,还会阅读IT行业的书,好比学Java时,还会去了解函数语言,如LISP。
四、找一些开源项目看看,大量试用第三方框架,还会写写demo。
五、阅读基础框架、J2EE规范、Debug服务器内核。

大多数程序都是第1种,到第5种不光须要浓厚的兴趣,还须要勇气:我能读懂吗?其实,你可以读懂的。

耐心,真的很重要。由于你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程当中常常会卡住,而一卡主可能就陷进了迷宫。这时,你须要作的,多是暂时中断一下,再从外围看看它:如API结构、框架的设计图。

我就说说如何读Java源码,以及我曾经的阅读感悟。

Java源码初接触
若是你进行过一年左右的开发,喜欢用eclipse的debug功能。好了,你如今就有阅读源码的技术基础。
我建议从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开发源码
在阅读Tomcat等源码前,必定要有必定的积累。个人切实体会,也能够说是比较好的阶梯是:
一、写过一些Servlet和JSP代码。注意,不是用什么Struts,它是很难接触到Servlet精髓的。用好Struts只是皮毛。
二、看过《Servlet和JSP核心编程》
三、看过Sun公司的Servlet规范
四、看过http协议的rfc,debug过http的数据包
若是有以上基础,我也不建议你开始读Tomcat源码。我建议你在阅读Tomcat源码前,读过Struts源码,Struts源码比WebWork要简 单得多。这个框架是能够100%读懂的,至少WebWork我没有100%读懂。我曾经由于读懂了Struts源码,本身写过一个Web框架。

固然,在读Struts框架前,最好看过它的MailReader等demo,很是很是不错的。
若是你作过一些Struts项目,那么读它时就更驾轻就熟了。
在读Struts前,建议看看mvnforum的源码,它部分实现了Struts的功能,虽然这个BBS作得不敢恭维。

若是你读过Struts,再开始考虑Tomcat源码阅读吧。
不过,我仍是不建议直接读它,先读读onJava网站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最简易版。它告诉你HttpServletRequest如何在容器内部实现的,Tomcat如何经过Socket来接受外面的请求,你的Servlet代码如何被Tomcat容器调用的(回调)。
学习JSP,必定要研读容器将JSP编译后的Servlet源码。
为何我老是称呼Tomcat为容器,而不是服务器?这个疑问留给你们吧。

若是你必定要读Tomcat,那么就读Jetty吧。至少它是嵌入式,能够直接在eclispe里面设置断点debug。虽然Tomcat也有嵌入式版本。

Java数据库源码阅读
我建议,先读读Sun的JDBC规范。
我想你必定写过JDBC的代码,那么这时候能够开始阅读源码了。
若是了解JDBC规范(接口),那么它的实现,JDBC Driver就必定要开始了解,个人建议是,读读mysql的jdbc驱动,由于它开源、设计优雅。在读mysql的JDBC驱动源码时,建议看看mysql的内幕,官方正好有本书,《Mysql Internals》,我五年前读过一部分。好比你能够知道mysql的JDBC驱动,如何经过socket数据包(connect、query),给这个C++开发的mysql服务器交互的。

经过上面的阅读,你能够知道,你的业务代码、JDBC规范、JDBC驱动、以及数据库,它们是如何一块儿协做的。
若是你了解这些内幕,那么你再学习Hibernate、iBatis等持久化框架时,就会驾轻就熟的。

读过JDBC驱动,那么下一步必定要读读数据库了。而正好有一个强大的数据库是用Java开发的,Hsqldb。它是嵌入式数据库,好比用在桌面客户端软件里,如Mail Client。
我四年前为此写过一篇小文,就不介绍了。

Java通信及客户端软件
我强烈推荐即时通信软件wildfire和Spark。你能够把wildfire理解成MSN服务器,Spark理解成MSN客户端。它们是经过XMPP协议通信的。
我曾经在一个项目中,定制过Spark,固然也包括服务端的一些改动。因此它们的源码我都读过。
我之因此推荐它们。是由于:
一、XMPP够轻量级,好理解
二、学习Socket通信实现,特别是C/S架构设计
三、模块化设计。它们都是基于module的,你既能够了解模块化架构,还能够了解模块化的技术支撑:Java虚拟机的ClassLoader的应用场景。
四、Event Driven架构。虽然GUI都是Event驱动的,但Spark的设计尤为优雅

这么说吧,读它们的源码,你会为作一名程序员而自豪,由于不管是他们的架构设计仍是代码,都太漂亮了。

Java企业级应用
固然了,就是Hibernate、Spring这类框架。
在读Spring源码前,必定要先看看Rod Johnson写的那边《J2EE Design and Development》,它是Spring的设计思路。注意,不是中文版,中文版彻底被糟蹋了。
在读Hibernate源码前,必定要读读Gavin King写的那本《Hibernate in Action》,同时,应该再读读Martin Fowler写的《企业应用架构模式》,它专门谈到持久化框架的设计思路。当你以为这两本书读透了,再去看它们源码吧。
并且,在读源码前,你会发现它们用到不少第三方Jar包,二三十个,你最好把那些Jar包先一个个搞明白。

说到企业应用,必定会涉及到工做流。我当年读过jBPM的源码,网上有介绍jBPM内核的文章(银狐)。我感受它的内核也就两千行,不要惧怕。我曾经阅读jBPM源码的博客
固然了,读工做流源码,前提是必定要对其理论模型有深刻的了解,以及写过一些demo、或作过一些项目。

我上面介绍的这些,是我本身读过的,也适合通常人阅读。
我也读过一些非Java源码,感受不错,也推荐给你们:
dojo源码 它的架构设计得很优雅,仿Java的import和extends。但实际应用起来一塌糊涂。咱们当年基于这个开发了本身的框架,不过我不是主力。

Flex源码 Flex 08年末刚刚开源后,我就用它作过一个中型项目,应该说是国内的技术先行者。当时市面没有有深度的书,也没有开源项目。我纯粹是看Flex的Help文档和源码,把项目搞定的。两三年过去了,如今以为系统设计得蛮优雅的。

好了,先介绍到这里。
上面说到的这些Java源码,我都是4年前、甚至更早读过的。技术变化这么快,像互联网的高速发展,催生不少高性能、分布式数据库,如hadoop。我一看,发现本身已经落伍了。
这几年,想必已经出现了不少优秀的框架,你们不妨分享出来。mysql

相关文章
相关标签/搜索