導航:首頁 > 源碼編譯 > java源碼看不懂

java源碼看不懂

發布時間:2024-06-22 03:33:20

1. 學習java的同學都是怎麼讀源碼

剛參加工作那會,沒想過去讀源碼,更沒想過去改框架的源碼;總想著別人的框架應該是完美的、萬能的,應該不需要改;另外即使我改了源碼,怎麼樣讓我的改動生效了?項目中引用的不還是沒改的jar包嗎。回想起來覺得那時候的想法確實挺??

工作了一年多之後准備跳槽了,開始了一輪的面試,其中有幾個面試官就問到了相關的源碼問題:ArrayList、HashMap的底層實現,spring、mybatis的相關源碼。問源碼的面試一般就是回去等消息,然後就沒然後了。

那時候開始意識到,源碼這東西在之前的工作的中感受不到,但是在面試中好像面的還挺頻繁的,從此有意識的開始了jdk部分源碼的閱讀(主要是集合)。一開始看源碼,看的特別糙,知道個大概,知道ArrayList的底層實現是數組,HashMap的底層是散列表(數組+鏈表);更深入一點的擴容、hash碰撞等等就不知道了。

讀spring源碼起於工作中遇到了一個問題(springjdbcTemplate事務,各種詭異,包你醍醐灌頂!),排查一段時間最終是解決了,但過程讓我非常難受,各種上網查資料、各種嘗試,感覺就像大海撈針一樣,遙遙無期。我下定決心,我要看一看spring的源碼,於是我買了一本《spring源碼深度斗帶解析》,結合著這本書、打開著eclipse,開始了spring的源碼閱讀之旅。至此,讀源碼成了習慣,源碼已經進入了我的心裡。

後來,springboot的火熱,讓我也想蹭上一蹭,於是有了springboot的啟動源碼系列,雖然還在進行中,指侍但是我相信我能將其完成;工作中用到了shiro,我又結合著《跟我學shiro》將shiro的源碼看了個大概,有了shiro源碼系列博文,還差一篇認證與授權(應該很快就能面世),shiro源碼系列就封筆了。最近在搭建自己的後台管理系統,用到了quartz,集成的過程也遇到了一些問題,因此有了quartz的兩篇文章。

慢慢的,從一味的網上找資料變成了很多時候會從源碼中找答案。不求能讀太多的源碼,但願自己接觸的技術都能讀上一讀,路漫漫其修遠兮,吾將上下而求索!

大家為什麼要讀源碼?

很多人一定和我一樣的感受:源碼在工作中有用嗎?用處大嗎?很長一段時間內我也有這樣的疑問,認為哪些有事沒事扯源碼的人就是在裝,只是為了提高他們的逼格而已。

那為什麼我還要讀源碼呢?一剛開始為了面試,後來為了解決工作中的問題,再後來就是個人喜好了。說的好聽點是有匠人精神;說的委婉點是好奇(底層是怎麼實現的);說的不自信點是對黑盒的東西我用的沒底,怕用錯;說的簡單直白點是提升自我價值,為了更高的薪資待遇(這里對真正的技術迷說聲抱歉)。

源碼中我們可以學到很多東西,學習別人高效的代碼書寫、學習別人對設計模式的熟練使用、學習別人對整個架構的布局,等等。如果你還能找出其中的不足,那麼恭喜你,你要飛升了!會使用固然重要,但知道為什麼這么使用同樣重要。從模仿中學習,從模仿中創新。

讀源碼不像圍城(外面的人想進來,裡面的人想出去),它是外面的人不想進來,裡面的人不想出去;當我們跨進城內,你會發現(還是城外好,皮!)城內風光無限,源碼的海洋任我們遨遊!

首先我們要對我們的目標有所了解,知道她有什麼特點,有些什麼功能。對對方都還不了解,就想著進入別人的內心世界,那不是臭不要臉嘛,我們要做一個有著流氓心的紳士;對她有個大致的了解了,就可以發起攻勢,一舉拿下。

那麼怎麼樣了解了,方式有很多,我這里提供幾種,僅供參考

最好的方式就是官方參考指南,親生父母往往對孩子是最了解的,對孩子的描述也是最詳細的;比唯銷吵如SpringBootReferenceGuide就是對springboot最詳細的描述,怎麼樣使用springboot、springboot特性等等,通過此指南,springboot在你面前一覽無遺;

但是,springboot畢竟是外國人的孩子,如果英語不好,估計讀起來有點頭疼了,不過我們有google翻譯呀,咬咬牙也是能看的。源碼世界的丈母娘、老岳丈是非常慷慨的!

其次是書籍,國外優秀的有很多,國內也不乏好書,比較推薦此方式,自成體系,讓我們掌握的知識點不至於太散。這就是好比是源碼的閨蜜,對源碼非常了解,重點是挺大方,會盡全力幫助我們了解源碼。

再次就是博客,雖然可能覺得知識點比較散,但是針對某個知識點卻特別的細,對徹底掌握非常有幫助,園子內就有很多技術大牛,寫的博客自然也是非常棒,非常具有學習價值。當然還有社區、論壇、github、碼雲等等。這就是源碼的朋友圈,我們從中也能獲取到非常多關於源碼的信息。

設計模式的了解

優秀的框架、技術從不乏設計模式;jdk源碼中就應用了很多設計模式,比如IO流中的適配器模式與裝飾模式、GUI的觀察者模式、集合中的迭代器模式等等;spring源碼中也是用到了大量的設計模式。設計模式有什麼優點、各適用於什麼場景,不是本文的內容,需要我們大家自行去了解。

我們只需要對一些常用的設計模式有個大致了解,再去讀源碼是比較好的;不需要將23種設計模式都通讀,也不需要將常用設計模式完全理解透;對於全部通讀,我們時間有限,另外有些模式確實不太好理解、用的少,性價比不高,沒必要全部都讀。

推薦書籍:《HeadFirstDesignPatterns》(中文版:《HeadFirst設計模式》)、《Java與模式》;

另外我比較推薦的一種學習設計模式的方式是讀別人博客:java_my_life,劉偉技術博客,chenssy的設計模式;

設計模式之於源碼,就好比逛街購物之於女人,想順利勾搭源碼,我們需要好好掌握設計模式這個套路。

配合ide進行斷點追蹤

我們通過源碼的圈子對源碼的了解終究只是停在表面,終究還是沒有走進她的內心,接下來我就和大家分享下,我是如何走進她的內心的!

相信看過我的源碼博客的小夥伴都知道,我非常喜歡通過idea斷點來進行源碼追蹤,斷點追蹤源碼是我非常推薦的一種方式。斷點不僅可以用來調試我們的代碼,也可以用來調試我們用到的框架源碼。

面對未知的、茫茫多的源碼,我們往往沒有足夠的時間、經歷和耐心去通讀所有源碼,我們只需要去讀我們關注的部分即可(有人可能會說我都不關心,這?)。那為什麼要用斷掉調試的方式來跟源碼,而不是直接從源代碼入手去跟我們關注的部分呢?

嘗試過的小夥伴應該知道,如果我們對源碼不熟悉,直接通過源碼的方式去跟,一方面很容易迷路(多態,會有很多子類實現),不知道接下來跟哪一個,另一方面也很容易跟丟,當我們跟入的很深的時候,很有可能就忘記上一步跟到哪了。所以讀源碼的重要性淺顯易懂了。

2. JAVA閱讀源碼,大量英文注釋閱讀不方便,求集成idea裡面的翻譯java注釋由英文翻譯為中文的工具。

學會在idea(eclipse)中閱讀、調試源碼,是java程序員必不可少的一項技能。


在idea中配完環境後,默認其實也是能夠對jdk的源碼進行debug調試的。但是無法在源碼中添加自己的注釋,無法添加自己的理解。如果乾瞪眼看的話,可能過段時間,就忘記了。下面就介紹下,如何在jdk源碼中為所欲為,像在我們自己的代碼中一樣寫注釋、調代碼:


打開idea,選擇Project->File->Project Structure->SDKs->Sourcepath,初始狀態如下圖 :


這時,再重新打開jdk的源碼類,我們就可以在源java文件中,添加自己的注釋了。

一定注意:添加註釋時,一定不要新加一行寫注釋。最好在一行代碼的後面,使用//進行注釋。否則行號和真正的jre中編譯後的代碼行號對應不上,如果對源碼debug時,會出現代碼運行和行號不匹配的情況

3. 如何快速讀懂項目源碼javaWeb

一:學會如何讀一個JavaWeb項目源代碼 步驟:表結構->web.xml->mvc->db->spring
ioc->log-> 代碼
1、先了解項目資料庫的表結構,這個方面是最容易忘記 的,有時候我們只顧著看每一個方法是怎麼進行的,卻沒
有去了解資料庫之間的主外鍵關聯。其實如果先了解數據 庫表結構,再去看一個方法的實現會更加容易。
2、然後需要過一遍web.xml,知道項目中用到了什麼攔
截器,監聽器,過濾器,擁有哪些配置文件。如果是攔截 器,一般負責過濾請求,進行AOP 等;如果是監 可能是定時任務,初始化任務;配置文件有如使用了 spring
後的讀取mvc 相關,db 相關,service 相關,aop 相關的文件。
3、查看攔截器,監聽器代碼,知道攔截了什麼請求,這
個類完成了怎樣的工作。有的人就是因為缺少了這一步, 自己寫了一個action,配置文件也沒有寫錯,但是卻怎麼
調試也無法進入這個action,直到別人告訴他,請求被攔
4、接下來,看配置文件,首先一定是mvc相關的,如 springmvc
中,要請求哪些請求是靜態資源,使用了哪些 view 策略,controller 註解放在哪個包下等。 然後是db 相關配置文件,看使用了什麼資料庫,使用了
什麼orm框架,是否開啟了二級緩存,使用哪種產品作 為二級緩存,事務管理的處理,需要掃描的實體類放在什 么位置。最後是spring 核心的ioc
功能相關的配置文件, 知道介面與具體類的注入大致是怎樣的。當然還有一些如 apectj 置文件,也是在這個步驟中完成
5、log
相關文件,日誌的各個級別是如何處理的,在哪些 地方使用了log 記錄日誌
6、從上面幾點後知道了整個開源項目的整體框架,閱讀 每個方法就不再那麼難了。
7、當然如果有項目配套的開發文檔也是要閱讀的。

4. JAVA中看別人項目源碼,從哪裡開始看,順序怎麼樣 比如 實體類 方法 介面 實現類 還有其他的

首先,如果有別人項目的開發文檔,是必須先閱讀的東西;
其次,最好藉助於開發工具,比如導入eclipse,比如代碼中按下ctrl+T就會顯示當前類型的關聯關系,還可以進行class搜索等。
第三,通過運行代碼,跟蹤進去,用debug模式查看一些關心的變數和方法是如何被調用和執行的。

MVC項目,可以從下往上看,就是從資料庫操作,然後封裝, service,到Action,再到頁面。

5. JAVA鍒氬紑濮嬪︽槸瑕佸厛鐪嬫簮浠g爜鍚鍙鏄涓鐐逛篃鐪嬩笉鎳傛槸浠涔

鏈浜轟笉鏄楂樻墜錛岀洿鍒扮幇鍦ㄨ繕鍦ㄥ墮噷瀛︺傛寜鐞嗚存槸娌℃湁璧勬牸鍦ㄦゅ敔鑸岀殑
浣嗘槸鍐欎簡涓鐐逛唬鐮侊紝浜烘湁鐐圭瘡銆備簬鏄涓婃潵鐜╃帺
鎴戣夊緱搴旇ヤ粠鏈鍩虹鐨勫﹁搗錛氭暟鎹綾誨瀷銆佸彉閲忋佽繍綆楃︺佽〃杈懼紡銆佽鍙ャ佹寚浠ゃ侀『搴忥紝閫夋嫨錛屽驚鐜錛屾暟緇勶紝鍑芥暟 緇撴瀯(瀵逛互鍚庡︿範綾誨ぇ鏈夊府鍔)
鏈濂戒互c涓轟緥
榪欐柟闈㈢殑濂戒功鏈<<C紼嬪簭璁捐>>璋嫻╁己鏁欐巿鐨,<<21澶╁﹂欳璇璦>>,鐞兼柉甯冩湕鐨勶紝鍚庤呭﹁搗鏉ヨ交鏉句竴浜涘墠鑰呭圭畝鍗曠畻娉曟秹鍙婄殑澶氫竴浜
鐒跺悗綆鍗曞湴瀛︿竴涓婥++,涓嶄竴瀹氶潪寰楀﹀お澶氾紙褰撶劧浜嗙簿鍔涘厖娌涘逛箣鍏磋叮嫻撳帤鐨勪緥澶栵級錛屼互灝佽咃紝緇ф壙銆佸氭佷負涓
褰撶劧浜嗕篃鍙涓嶈繘琛岀浜屾ョ洿鎺ュ紑濮嬪Java錛屼笉榪囩涓姝ヤ竴瀹氳佽蛋濂
鑷充簬Java鏂歸潰錛屾妸鍓嶉潰浜屾ョ敋鑷崇涓姝ュ仛濂戒簡瀛﹁搗鏉ュ緢瀹規槗錛屾垜涔熸病鐪嬩粈涔圱hink in Java
紲濅綘鎴愬姛錛佸厖鍒嗚嚦Java涓鑾峰緱涔愯叮......

6. 你好,我剛開始學JAVA,昨天看了點源碼有點疑問

這個是叫做構造函數的重載。
這樣子寫的原因是:
有時候你會聲明 Person people=new Person("lihong");
有時候你會聲明 Person people=new Person("lihong","west");
如果不都實現的話,上面兩種聲明就不能這樣用了!

閱讀全文

與java源碼看不懂相關的資料

熱點內容
程序員三高 瀏覽:178
pythonfiddle 瀏覽:215
韓信分油總共有幾種演算法 瀏覽:941
程序員思維方案 瀏覽:970
編譯環境要裝c盤嗎 瀏覽:648
單片機生成pwm 瀏覽:206
線上租車有什麼app 瀏覽:908
php程序修改 瀏覽:684
下列能查找文件或文件夾的操作是 瀏覽:314
遙感科學與技術演算法待遇 瀏覽:136
cad標注半徑命令 瀏覽:367
打卡領購app邀請碼怎麼填 瀏覽:336
編程訪問許可權沖突 瀏覽:152
桌面運維如何轉伺服器運維 瀏覽:627
tomcat如何設置伺服器 瀏覽:679
php編譯支持mysql 瀏覽:817
mir4手游安卓版怎麼玩國際服 瀏覽:23
伺服器程序怎麼刪除 瀏覽:657
阿里年薪70萬程序員名單照片 瀏覽:575
android定製輸入法 瀏覽:758