源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。 l1 l7 J' G! M. \- f
; b. J7 B4 @) T U; m, j1 A说到技术基础,我打个比方吧,如果你从来没有学过java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸收到营养的,特别是《深入Java虚拟机》这类书,别人觉得好,未必适合现在的你。 3 o! V6 X5 F- t. D
虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它。我文中会专门谈到这个,暂时不展开。 : Z3 }& A/ q- o8 i2 w. W4 q* |' |
强烈的求知欲,我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦): % B! ~- c3 z# K5 R. i1、只关注项目本身,不懂就baidu一下。 * ~+ i7 p# g6 H
2、除了做好项目,还会阅读和项目有关的技术书籍,看wikipedia。 / g; i4 f, ^7 y0 W3、除了阅读和项目相关的书外,还会阅读IT行业的书,比如学Java时,还会去了解函数语言,如LISP。 7 y9 y1 k7 d" e, w: C
4、找一些开源项目看看,大量试用第三方框架,还会写写demo。 - l. e+ V6 s3 c7 n) _. b5、阅读基础框架、J2EE规范、Debug服务器内核。 ( O$ U* W2 d' J
$ e; `( ]" ?- ]' {2 n; m& Y; x
大多数程序都是第1种,到第5种不光需要浓厚的兴趣,还需要勇气:我能读懂吗?其实,你能够读懂的。 & F2 S& {' f- X- |3 e, O- d
9 C- H9 Q5 G; D耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫。这时,你需要做的,可能是暂时中断一下,再从外围看看它:如API结构、框架的设计图。 + I. q) T: v7 a! C* R
# W+ b. E$ Q) I ?9 A1 p5 j4 H
我就说说如何读java源码,以及我曾经的阅读感悟。 1 w, h, `& F m) ?, N1 v) I
8 `7 s$ _: J: [( cJava源码初接触 . G0 K N; ~: K1 k+ F. a* P
如果你进行过一年左右的开发,喜欢用eclipse的debug功能。好了,你现在就有阅读源码的技术基础。 ! A8 X0 `% C) J( b我建议从JDK源码开始读起,这个直接和eclipse集成,不需要任何配置。 3 b, W# ? c8 I- x$ c
2 r7 ^$ Y: A" o6 ?9 D. p" t
可以从JDK的工具包开始,也就是我们学的《数据结构和算法》Java版,如List接口和ArrayList、LinkedList实现,HashMap和TreeMap等。这些数据结构里也涉及到排序等算法,一举两得。 7 g* g b; O6 Q5 y* c) t
面试时,考官总喜欢问ArrayList和Vector的区别,你花10分钟读读源码,估计一辈子都忘不了。 : s0 C# ^: D0 j' f2 x J& t" l8 T! ^4 _/ \$ k3 l) q
然后是core包,也就是String、StringBuffer等。 ) i" R: r4 b) G$ F$ {1 D如果你有一定的Java IO基础,那么不妨读读FileReader等类。我建议大家看看《Java In A Nutshell》,里面有整个Java IO的架构图。Java IO类库,如果不理解其各接口和继承关系,则阅读始终是一头雾水。 , T% ?4 K. g. w2 Q3 O( T, c3 Y
Java IO 包,我认为是对继承和接口运用得最优雅的案例。如果你将来做架构师,你一定会经常和它打交道,如项目中部署和配置相关的核心类开发。 " \: q+ k% t* f& w8 ^
- B2 G6 B! a( a: m) _读这些源码时,只需要读懂一些核心类即可,如和ArrayList类似的二三十个类,对于每一个类,也不一定要每个方法都读懂。像String有些方法已经到虚拟机层了(native方法),如hashCode方法。 # V5 h; G- s' s" H2 Q& E
) l8 a7 ~# _' r, D0 x8 X; h V当然,如果有兴趣,可以对照看看JRockit的源码,同一套API,两种实现,很有意思的。 - X1 \6 }0 `$ i7 u+ L
如果你再想钻的话,不妨看看针对虚拟机的那套代码,如System ClassLoader的原理,它不在JDK包里,JDK是基于它的。JDK的源码Zip包只有10来M,它像是有50来M,Sun公司有下载的,不过很隐秘。我曾经为自己找到、读过它很兴奋了一阵。 + T$ ~: N, F) ^ - y' P) ~/ Q1 a x' fJava Web开发源码 & U) U- _( n2 @. a: {! I
在阅读Tomcat等源码前,一定要有一定的积累。我的切实体会,也可以说是比较好的阶梯是: * U# v- M( e+ t4 v6 [& P# A
1、写过一些Servlet和JSP代码。注意,不是用什么struts,它是很难接触到Servlet精髓的。用好Struts只是皮毛。 % u# G/ Q1 x7 T+ \9 p% j2、看过《Servlet和JSP核心编程》 @) V: U$ G$ z0 U" G8 u3、看过Sun公司的Servlet规范 ' a& X. M8 h; n0 ^4、看过http协议的rfc,debug过http的数据包 , P$ H/ S* H4 v d
如果有以上基础,我也不建议你开始读Tomcat源码。我建议你在阅读Tomcat源码前,读过Struts源码,Struts源码比WebWork要简单得多。这个框架是可以100%读懂的,至少WebWork我没有100%读懂。我曾经因为读懂了Struts源码,自己写过一个Web框架。 ' c& H. d/ H* n' h2 @
* X( c8 t( @$ y. K( [
当然,在读Struts框架前,最好看过它的MailReader等demo,非常非常不错的。 : |& T9 e6 {& f1 w8 i; x! }
如果你做过一些Struts项目,那么读它时就更得心应手了。 + {7 J7 y* l, m" n. K& ~: N在读Struts前,建议看看mvnforum的源码,它部分实现了Struts的功能,虽然这个BBS做得不敢恭维。 ) l4 I% p2 X& \7 m' G