Table of Contents
概述
jdk是每一個使用java的人員每一天都在使用的東西,博主也已經研究了jdk源代碼中的一些類了,本篇博客是想從jdk包結構的角度去拆分jdk的源代碼包,以提供從設計角度的一個理解。
本篇博客基於jdk1.8
jdk包總覽
jdk的包如下圖所示:
該圖是直接從jdk的包目錄截取出來的圖,我們常常打交道的java源代碼都位於rt.jar這個包下面, 對java有一定使用經驗的讀者應該對此包都有印象。我們想着重分析的包也是rt.jar這個包。
在此之前,其他這么多的jar包是拿來干什么的呢?它們各自發揮的作用大致如下:
access-bridge-64.jar
Java Accessibility API是Java Accessibility Utilities的一部分,它是一組實用程序類,可幫助輔助技術提供對實現Java Accessibility API的GUI工具包的訪問。
charsets.jar
Java 字符集,包含 Java 所有支持字符的字符集
cldrdata.jar
Unicode CLDR為軟件提供了支持世界語言的關鍵構建塊,提供了最大和最廣泛的語言環境數據庫。 這些數據被廣泛的公司用於其軟件國際化和本地化,使軟件適應不同語言的慣例以用於此類常見軟件任務.
deploy.jar
Java安裝目錄的常見部分 - 該文件運行某些產品的安裝。 正確設置Java路徑后,用戶可以執行此文件(只需雙擊它或按文件上的Enter鍵),要部署的應用程序將運行其安裝程序。 例如。 諾基亞OVI套件通常使用這種部署形式。 作為彼此的JAVA包,如果您將其重命名為ZIP並打開內容,則可以檢查包中的類。
dnsns.jar
即DNS naming service ,提供DNS地址服務的包,里面只有2個方法 getHostByAddr和 lookupAllHostAddr
jaccess.jar
定義Assistive Technologies.AWT(Abstract Window Toolkit)使用的JDK實用程序類
javaws.jar
JNLP(Java Network Launching Protocol )是java提供的一種可以通過瀏覽器直接執行java應用程序的途徑。
jce.jar
java類庫是java發布之初就確定了的基礎庫, 而javax類庫則是在上面增加的一層東西,就是為了保持版本兼容要保存原來的,但有些東西有了更好的解決方案, 所以,就加上些,典型的就是awt(Abstract Windowing ToolKit) 和swing。) 這個包都是加密相關的。
jfr.jar
和 jdk\bin\jmc.exe有關系。Java Mission Control 包括 JMX 控制台和 Java 飛行記錄器。 Java 飛行記錄器 (JFR) 是一個用於收集有關正在運行的 Java 應用程序的診斷數據和概要分析數據的工具。它集成到 Java 虛擬機 (JVM) 中, 幾乎不會帶來性能開銷,因此甚至可以在高負載生產環境中使用。使用默認設置時,內部測試和客戶反饋表明性能影響低於 1%。 對於一些應用程序,這一數字會大幅降低。但是,對於短時間運行的應用程序 (不是在生產環境中運行的應用程序類型), 相對的啟動和預熱時間可能會較長,這對性能的影響可能會超過 1%。JFR 收集有關 JVM 及其上運行的 Java 應用程序的數據。
jfxrt.jar
JDK有個 rt.jar ,是存儲JAVA語言核心類的的。這個jfxrt.jar就相當於JavaFX的rt.jar. JavaFX是一組圖形和媒體包,使開發人員能夠設計,創建,測試,調試和部署在不同平台上一致運行的富客戶端應用程序。在jdk最新的發版當中,javafx的包已經被移除了。
jfxswt.jar
也是和JavaFx相關,為JavaFx和Swing提供一些兼容性操作。
jsse.jar
SSL連接,驗證的包,
localedata.jar
日期顯示國際化的包,里面包含各地區的日期文字。
management-agent.jar
里面只有一個文本文件。
nashorn.jar
包括
1.動態鏈接.包含用於鏈接調用的動態調用站點的接口和類。 dynalink與java.lang.invoke包密切相關,並且依賴於該包。 雖然java.lang.invoke為invoke dynamic調用站點的動態鏈接提供了一個低級別的API,但它不提供一種方法來表示對象的更高級別操作,也不提供實現這些操作的方法。 如果一種語言是靜態類型的,並且它的類型系統與JVM的類型系統匹配,那么它可以使用通常的調用、字段訪問等指令(例如invokevirtual、getfield)來實現這一點。 但是,如果語言是動態的(因此,某些表達式的類型直到在運行時進行計算時才知道),或者其對象模型或類型系統與JVM的對象模型或類型系統不匹配, 那么它應該使用invokedynamic調用站點,並讓dynalink管理它們。
2.Javascript引擎 從 JDK 8 開始,Nashorn取代 Rhino 成為 Java 的嵌入式 JavaScript 引擎。Nashorn 完全支持ECMAScript 5.1 規范以及一些擴展。該特性允許開發人員將 JavaScript 代碼嵌入到 Java 中,甚至從嵌入的 JavaScript 中調用 Java。此外, 它還提供了使用jrunscript從命令行運行 JavaScript 的能力。
plugin.jar
功能很龐大的一個包。
resources.jar
提示信息顯示國際化的包,里面各地區的文字,圖片等。
rt.jar
java核心源代碼包
sunec.jar ,sunjce_provider.jar,sunmscapi.jar,sunpkcs11.jar
都是加密相關的包。
zipfs.jar
java 對zip文件操作的支持。
rt.jar包結構分析
rt.jar包含核心Java Runtime環境的所有已編譯類文件。rt.jar包的總體結構如下圖所示
當我們在裝好java環境之后,有一些類我們就是可以直接使用的,例如List,原因在於java的類加載機制已經將這些最基本的類即jdk核心代碼加載好了。負責這一事情的類加載器就是Boot Strap ClassLoader,它唯一做的事情就是負責從bootstrap classpath加載類,並且只加載rt.jar。 並且該加載具有最高優先級。其中最為核心的也是我們最常使用的類位於java這個包下面,如下:
applet負責網絡應用程序部分,awt負責ui部分的支持。beans
io包負責輸入輸出流的支持,lang下面則包含了非常多的東西,包括反射,注解等。
math包包含了一些科學計算方面的類如BigDecimal等
net包含了支持網絡編程的類如Socket等等
nio即新io也是輸入輸出的支持,包含Channel管道通信等技術
rmi包含了對遠程服務調用支持的類
security包含安全,權限控制相關的類
sql包含了數據庫相關技術的類例如Driver,DriverManager等類
text包含了文本內容相關支持的類
time包含日期相關的類如Date,Calendar,Month等等
util是一個非常大的包,下面包含的東西非常多,包括並發支持,正則表達式,日志,容器等非常重要的類。