一點一點看JDK源碼(〇)

来源:https://www.cnblogs.com/liuyuhangCastle/archive/2018/09/03/9580732.html
-Advertisement-
Play Games

一點一點看JDK源碼(〇) 原創文章,版權所有,未經允許進位轉載 寫在前面: 幾乎所有的大神都會強調看源碼,也強調源碼的重要性; 但是如何看源碼,源碼看什麼?看了什麼用?看了怎麼用? 困擾很多人,尤其是初學者。 本文簡單的回答以下幾個問題: 1.為什麼要看源碼? 2.什麼時候或什麼條件下看源碼? 3 ...


一點一點看JDK源碼(〇)

原創文章,版權所有,未經允許進位轉載

 

寫在前面:

幾乎所有的大神都會強調看源碼,也強調源碼的重要性;

但是如何看源碼,源碼看什麼?看了什麼用?看了怎麼用?

困擾很多人,尤其是初學者。

 

本文簡單的回答以下幾個問題:

1.為什麼要看源碼?

2.什麼時候或什麼條件下看源碼?

3.看源碼看什麼?

4.看源碼有什麼用?

5.源碼看完了怎麼用?

 

接下來以個人見解依次回答以上問題:

1.為什麼要看源碼?

  究這個問題,很多人都認為軟體會用即可,寫代碼也是一種軟體應用,這個是本質!

  我們都站在巨人的肩膀上,過去是,現在是,將來也是,這個巨人,是歷史!

  在拿到每一個產品並使用的時候,我們需要仔細閱讀產品說明書:(從不看說明書的人左轉)

 

    ①瞭解產品的使用功能

    ②瞭解產品的安全性能

    ③瞭解產品的毒性和副作用

    ④瞭解產品的維護周期和生命周期

    ⑤瞭解產品的廠商與聲明

 

  對於不正確使用產品至死致殘又狀告商家的,就好像被人砍了要找賣刀的算賬一樣,

  只要超越了一般產品的正常使用方式,出現的問題沒人會代你負責的。(扯遠了)

 

  源碼就是編碼的說明書,因為我們在使用這個源碼。

  我們需要閱讀源碼,從說明書的角度去正確使用這些工具。

 

2.什麼時候或什麼條件下看源碼?

  本人只有java開發經驗,所以只能以java舉例進行說明瞭。

 

  • 如果java的基礎語法已經學習完了,能夠寫一些簡單的代碼了
  • 如果對於java的面向對象設計能夠依葫蘆畫瓢了,已經學完了jdk中的大部分工具了
  • 如果每天學習4小時以上,已經連續學習超過一個月了
  • 如果你很閑(不知道做什麼)
  • 如果你很窮(還會寫點代碼)
  • 如果你想吃這口技術飯

  

  以上六條只要滿足三條以上,已經是應該適當看看源碼的時候了。

 

3.看源碼看什麼?

  我們說萬物究其本源,要透過現象看本質,實際上這兩句話並不是完全正確的。

  萬物的本源應該是微觀粒子領域吧,事物的本質都是宇宙基本定律,也許還能更細究。

 

  假設我們要看java的原碼,那麼又要考慮java是運行在jvm上的,應該看jvm原碼。

  同時jvm又是c++寫的,我們應該看c++原碼。

  同時c++運行在電腦底層是彙編,我們應該看彙編原碼。

  這哪裡有完。

 

  所以,看java原碼,先看使用的工具集,即jdk就足夠了。

  一項一項向上系統的看才是正確的,至於其他的也並非不進行接觸,可能不是那麼系統而已。

 

  而jdk看什麼?

  打開API,好像隨便點一個類,都會有一個繼承(extends)的類,同時又實現(implements)很多介面

  難道一個一個向上看,看到最頂層,然後從頂層開始向下學習麽?

  筆者也想過用這種方式,剛看了幾分鐘就覺得不對,原因如下:

  • java雖然是單根繼承體系,但是允許多介面實現;
  • java的設計根類是Object,但是根介面有很多;
  • java中很多類的設計是網狀的,並非一個單根樹結構;
  • java中很的介面可能又有很多子介面,孫子介面,光看介面,非常疲乏;

  所以,看java,要從一個常用的工具開始看,

  這個工具一定是一個具體的實現類,而並非抽象類,並非是介面。

  從一個點開始,向上開始展開。同時這個類最好不是jvm底層有運算符相關的

    (如String類的設計不建議最開始就看)

 

4.看源碼有什麼用?

  這個問題看起來好像和為什麼看源碼是一個意思,但是實際上要解釋的是不同的內涵。

 

  看源碼,主要是看源碼體現出的幾個問題,他分為兩個層次:

  4.1.源碼的構成模式

    構成模式,是指從一個類開始看,瞭解這個類的構成。一般包括:

      ①類的繼承體系

      ②類的實現體系

      ③類的成員變數

      ④類的構造器

      ⑤類的方法實現

 

    在看類的構造器和方法實現的時候,會發現有些類的構造器是使用了父類構造器,或

    加工了父類的構造器的。同理,類的方法實現,即時具體代碼看不懂,也要知道這個

    方法是做什麼的,比如入參,出參,加工邏輯,是否是繼承,是否是父介面實現等。

 

  4.2.源碼的設計模式

    看源碼的繼承體系和實現體系的時候,肯定會有一種不知所然的感覺,

    “這個為啥要繼承?”“這個為啥要那麼多介面?”

    當然,看的數量少,必定會有這種感覺。

    而源碼中的設計模式,實際上是妙不可言的,有些變數的命名,也是很走心的,

    有些沒有寫在doc中的雙斜杠註釋,才是真的應該關心,在API中看不到的內容。

 

5.源碼看完了怎麼用?

  看源碼看jdk的原碼(自己說的,自己打臉),實際上對jdk進行改動的人少之又少,雖然開源。

  

  我們看源碼,看完了,明白了其中的良苦用心,難道我們在使用這些工具的時候能玩出花來麽?

  也許根本做不到,美麗花朵夏天一場雨也許就掉光了。

  我們會不用jdk設計好的基類,而是在其基礎上進行擴展麽?好像也不會。

 

  實際上jdk的設計模式,是我們開發模式的抽象集成。如:

    如何把控類的邊界?

    如何把控類的擴展性?

    如何提高類的可維護性?

    如何提高類的健壯性?

    如何進行代碼重構?

 

    難道架構師真的是個滿嘴跑火車號令群猿的人而已麽?

    難道介面工程師只是命名寫註釋麽?

    難道開發工程師拿到固定需求是隨便寫類的麽?

 

  如果一個大型的研發體系中,沒有人懂源碼,沒有人懂架構,哦~呵呵~

  這必將影響這個研發項目產出產品的生命周期了。

  

  怎麼用,取決於個人,看多深,也取決於個人,也許看到了一個新奇的代碼很是喜歡呢。

 

理論就說這些,之後將一個一個拆,對於源碼的體系,進行慢慢的剖析。

我也不知道會更多久,會不會更下去,堅持一點是一點吧。

 

以上!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原因: 元素設置了float屬性後,就會脫離文檔流,當 包含框 的高度小於 浮動框 的時候,會出現高度塌陷。因此才需要清除浮動! 表現如圖:包括框container已經包不住float的圖片了! 清除浮動方法: 1:給 包含框 添加 after偽元素清除浮動。代碼: 2:使用BFC, 原理:讓浮動塊 ...
  • 在上一篇《前端面試 - 演算法篇(二分法)》的評論中,有朋友提出了一個“迴圈殺人游戲” 就在我為之苦惱的時候,一位同事在我身旁經過,突然說了一句:“咦,這不是約塞夫問題嗎?” 一、面試題 原題目不太明朗(一號到底殺不殺?) 於是把題目優化一下,更接近於原本的約塞夫問題 假設有100人,分別編號 1~1 ...
  • left right aaa ... ...
  • JS介紹 數據輸出\輸入 JS變數 JS數據類型 進位介紹 數字(Number) 字元串(String) Boolean類型/Undefined類型/Null類型 類型轉換 運算符 流程式控制制 break與continue關鍵字 數組(Array) 函數(function) 函數中的幾個參數 sort ...
  • 獲取ECharts npm install echarts save <! more 自定義構建ECharts 我選用的是常用版的echarts/dist/echarts.common.js 在我的項目根目錄下myProject新建echarts.common.js,然後將echarts.commo ...
  • 練習jquery上的一個插件編寫 1.標準的3個基本內容,根目錄裡面創建2個文件夾(存放css和js)和1個html頁面文件; 2.測試的主html頁面代碼 3.css文件中設置2個css格式文件 3.1第一個main.css 3.2 menu.css 4.存放js的文件中有2個文件,1個是jque ...
  • Learun.framework v7━ net快速開發框架 LeaRun.Framework v7 ,基於.NET的快速信息化系統開發、整合框架,為企業或LeaRun.Framework v7,基於.NET的快速信息化系統開發、整合框架,為企業或個人在.NET環境下快速開發系統提供了強大的支持,開 ...
  • 基於Spring Boot 2.0.4、Spring Cloud Finchley.SR1的Spring Cloud使用樣例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...