是时候该开始读一读JDK源码了
為什么要讀JDK源碼
當然不是為了裝,畢竟誰沒事找事虐自己 …
1、面試跑不掉。現(xiàn)在只要面試Java相關(guān)的崗位,肯定或多或少會會涉及JDK源碼相關(guān)的問題。
2、弄懂原理才不慌。我們作為JDK的使用者,雖然說天天用得很開心,但是有時候遇到問題還是得跟到底層源碼去看看,才能幫助我們更好的弄懂原理,
3、學(xué)習(xí)優(yōu)秀的代碼、思想和模式。JDK畢竟是一個優(yōu)秀的代碼庫,我們天天用,源碼也就在里面,作為一個有志向的程序員,讀一讀源碼也能讓我們吸取到更多優(yōu)秀的思想和模式。
4、睡前催眠。額 …… 不過的確有效(滑稽)。
源碼難嗎?
廢話,當然有難度啦,不然我也不會到現(xiàn)在都還沒看完,而且看了也經(jīng)常忘,哭唧唧…
畢竟像JDK這種源碼,和我們平常練手寫小例子、寫業(yè)務(wù)代碼不一樣,人家畢竟是 類庫,為了性能、穩(wěn)定性、通用性,擴展性等因素考慮,加入了很多輔助代碼、泛型、以及一些設(shè)計模式上的考量,所以看起來肯定沒有那么輕松,沒辦法一眼看穿它。
所以這玩意兒肯定是一個長期的過程,我個人建議(包括我自己也是這樣),有時候遇到一些問題,可以針對性地把某些組件或者某個部分的源碼,跟到底層去看看,然后做點筆記,寫點注釋啥的,這樣慢慢就能滲透到很多的內(nèi)容了。
但是我們一定要有足夠的信心,我堅信代碼人家都寫出來了,我就不信我看不懂!
源碼該怎么看
1、方法一:按需閱讀。如果對某個組件、語法或者特性感興趣,或者遇到什么問題疑惑,可以有針對性地跟到底層源碼按需查看,這也是一種比較高效,能快速樹立信心的閱讀方式。
2、方法二:系統(tǒng)化閱讀。具體閱讀內(nèi)容和順序建議下文詳述。
3、多調(diào)試:如果僅僅靠眼睛看,然后腦補畫面調(diào)試還是比較吃力的,最好還是借助IDE動手調(diào)試起來,走兩步就知道了。
4、別光讀,記得讀完留下點什么。我覺得看了多少不重要,重要的是能輸出多少,多總結(jié)、歸納,寫注釋,記筆記
所以下文準備搭建一個Java源碼的閱讀和調(diào)試環(huán)境,建議人手一個,每當心血來潮時、遇到問題時、碰到疑惑時、閑得無聊時都可以打開工程看一看源碼,做做筆記和注釋。
搭建源碼閱讀調(diào)試環(huán)境
我個人覺得看源碼這個事情還是應(yīng)該單獨搞一個Java工程,源碼放里面,測試代碼也放里面,集中調(diào)試,集中看代碼,集中寫注釋比較方便一些。
1、創(chuàng)建源碼閱讀項目
選擇最普通的Java基礎(chǔ)項目即可:
2、創(chuàng)建兩個目錄
分別為:
- source:稍后放置JDK源碼進去
- test:放置測試代碼,里面還可以按需要建立層級子目錄
3、導(dǎo)入JDK源碼
有很多小伙伴問JDK的源碼在哪里呢?
遠在天邊,僅在眼前,其實在的JDK安裝目錄下就能找到。
JDK安裝目錄下有一個名為src.zip壓縮包,這正是JDK源碼!
將其解壓后拷貝到上面項目的source目錄下,這樣JDK源碼就導(dǎo)入好了。
有些小伙伴會有疑問,為什么要將JDK源碼導(dǎo)一份放到這個項目里? 其實主要原因還是方便我們在源碼里閱讀、調(diào)試、以及做筆記和注釋。
至于這份JDK源碼怎么用上,下文繼續(xù)闡述。
4、調(diào)試并運行
我們可以在test目錄里去隨意編寫一段測試代碼。
比如我這里就以HashMap為例,在test目錄下創(chuàng)建一個子目錄hashmap,然后在里面創(chuàng)建一個測試主入口文件Test.java,隨意放上一段測試代碼:
public static void main( String[] args ) {Map<String,Double> hashMap = new HashMap<>();hashMap.put( "k1", 0.1 );hashMap.put( "k2", 0.2 );hashMap.put( "k3", 0.3 );hashMap.put( "k4", 0.4 );for ( Map.Entry<String,Double> entry : hashMap.entrySet() ) {System.out.println( entry.getKey() +":" + entry.getValue());}}然后啟動調(diào)試即可。
不過接下來會有幾個問題需要一一去解決。
問題一:啟動調(diào)試時Build報錯,提示系統(tǒng)資源不足
解決方法: 加大Build process heap size。
設(shè)置方法:Preferences --> Build,Execution,Deployment --> Compiler,將默認700的數(shù)值加大,比如我這里設(shè)置為1700:
問題二:想從外層代碼F7單步調(diào)試進入JDK源碼內(nèi)部,結(jié)果發(fā)現(xiàn)進不去
這是因為調(diào)試時,JDK源碼受保護,一般單步調(diào)試不讓進,但是可以設(shè)置。
解決方法::
Preferences --> Build,Execution,Deployment --> Debugger --> Stepping
問題三:如何對JDK源碼做注釋?
調(diào)試進入JDK源碼以后,發(fā)現(xiàn)不能進行注釋,每個文件上都有一個小鎖的圖標,這是因為現(xiàn)在關(guān)聯(lián)的源碼并不是我們項目里剛拷進去的源碼,而是JDK安裝目錄下的src.zip只讀壓縮包。
解決辦法: 重新關(guān)聯(lián)JDK源碼路徑為本項目路徑下的這一份JDK源碼。
這樣一來,我們就可以愉快地對JDK源碼調(diào)試以及做注釋了。
源碼結(jié)構(gòu)和閱讀順序
JDK源碼畢竟太龐大了,所有都看不太現(xiàn)實,我們還是愿意根據(jù)日常使用和面試考察的頻繁度來挖取重要的內(nèi)容先看一看。
如果自己沒有特別的規(guī)劃,可以按照如下所示的建議閱讀順序往下進行:
具體的內(nèi)容簡介如下:
1、java.lang
這里面其實就是Java的基本語法,比如各種基本包裝類型(Integer、Long、Double等)、基本類(Object,Class,Enum,Exception,Thread)等等…
2、java.lang.annotation
包含Java注解基本元素相關(guān)的源碼
3、java.lang.reflect
包含Java反射基本元素相關(guān)的代碼
4、java.util
這里面放的都是Java的基本工具,最典型和常用的就是各種容器和集合(List、Map、Set)
5、java.util.concurrent
大名鼎鼎的JUC包,里面包含了Java并發(fā)和多線程編程相關(guān)的代碼
6、java.util.function +java.util.stream
包含Java函數(shù)式編程的常見接口和代碼
7、java.io
包含Java傳統(tǒng)I/O相關(guān)的源碼,主要是面向字節(jié)和流的I/O
8、java.nio
包含Java非阻塞I/O相關(guān)的源碼,主要是面向緩沖、通道以及選擇器的I/O
9、java.time
包含Java新日期和期間相關(guān)的代碼,最典型的當屬LocalDateTime、DateTimeFormatter等
10、java.math
主要包含一些高精度運算的支持數(shù)據(jù)類
11、java.net
主要包含Java網(wǎng)絡(luò)通信(典型的如:Socket通信)相關(guān)的源代碼。
共勉
看源碼這東西不能急,慢一點才能更快!共勉。
總結(jié)
以上是生活随笔為你收集整理的是时候该开始读一读JDK源码了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: boot-1学习
- 下一篇: H5 - template native