你是如何閱讀jdk源碼的?
閱讀別人的代碼作為開(kāi)發(fā)人員是一件經(jīng)常要做的事情。一個(gè)是學(xué)習(xí)新的編程語(yǔ)言的時(shí)候通過(guò)閱讀別人的代碼是一個(gè)最好的學(xué)習(xí)方法,另外是積累編程經(jīng)驗(yàn)。如果你有機(jī)會(huì)閱讀一些操作系統(tǒng)的代碼會(huì)幫助你理解一些基本的原理。還有就是在你作為一個(gè)質(zhì)量保證人員或一個(gè)小領(lǐng)導(dǎo)的時(shí)候如果你要做
的時(shí)候沒(méi)有閱讀代碼的能力是不能完成相應(yīng)的任務(wù)。最后一個(gè)就是如果你中途接手一個(gè)項(xiàng)目的時(shí)候或給一個(gè)項(xiàng)目做售后服務(wù)的時(shí)候是要有閱讀代碼的能力的。1:找相關(guān)的書
在看相關(guān)源碼時(shí)應(yīng)該對(duì)程序有整體了解,比如看虛擬機(jī)時(shí)至少要知道:
,Java內(nèi)存布局,class文件格式,加載連接的過(guò)程...很多人看源碼一點(diǎn)頭緒都沒(méi)有,就是因?yàn)椴涣私鈱?duì)應(yīng)的模塊是干嘛的(比如Java是 ,而不是 解釋器,call_stub()是為了找到對(duì)應(yīng)模板入口),了解這方面比較好的就是看官方文檔,或者看對(duì)應(yīng)源碼解析的書2:工具
看類庫(kù)首推idea,多用Structure,多自動(dòng)生成UML圖。先搞清楚接口和類之間的關(guān)系,在去分析函數(shù)。虛擬機(jī)的話還是用VS吧。vim好像不太合適。雖然我是vim粉。
3:閱讀注釋
有很多時(shí)候注釋才說(shuō)明一切,舉幾個(gè)很簡(jiǎn)單簡(jiǎn)單的例子,在IO阻塞的時(shí)候線程是出于BLOCKING還是RUNNABLE,線程的interrupt會(huì)中斷那些函數(shù)?注釋里都說(shuō)的很清楚,看到函數(shù)的時(shí)候只要簡(jiǎn)單讀讀注釋就知道了。
4:有目的性
源碼量那么大,不要妄想一口氣都看完。最好符合你當(dāng)前的目的,比如你想搞懂多線程,你就主要看JUC,想搞懂IO就多去看NIO,想看
就去看ClassFileParser。看模塊的時(shí)候,要注意接口大于一切,或者說(shuō)函數(shù)大于一切。先不要妄想搞懂所有細(xì)節(jié),先找?guī)讉€(gè)比較關(guān)鍵的函數(shù),搞懂函數(shù)的作用(比如應(yīng)該仔細(xì)分析一下函數(shù)名稱和參數(shù)名稱)然后再往下進(jìn)行。再看Java類庫(kù)的時(shí)候要多注意類是不是abstract的,是不是用的 ,多關(guān)注函數(shù)前的 ,這一般說(shuō)明這個(gè)函數(shù)是給誰(shuí)用的。多注意這些細(xì)節(jié)而不是傻傻的過(guò)一遍邏輯,能從里面學(xué)到不少關(guān)于設(shè)計(jì)的東西。還可以注意什么地方是為了之前的設(shè)計(jì)而委曲求全的做法,畢竟一個(gè)這么多年的 ,肯定不是什么地方都是完美的。5:實(shí)驗(yàn)+debug
可以多做做實(shí)驗(yàn),ide的斷點(diǎn)都很好用,記得之前看
的源碼就一直debug。WRITE-BUG研發(fā)團(tuán)隊(duì)衷心希望【W(wǎng)RITE-BUG數(shù)字空間】可以給每位同學(xué)一個(gè)屬于自己的秘密空間,同時(shí)祝愿大家在“公開(kāi)圈子”世界里,遇見(jiàn)志同道合的伙伴們,因?yàn)槲覀兣c大家一樣,都曾孤獨(dú)前行著。


