java高級-類加載器

圖

圖
1.classloader
程序不會一次性加載所有的.class文件,.class文件有入口方法。而是根據(jù)程序需要根據(jù)java的加載機制動態(tài)的加載某一個.class文件到內(nèi)存中
1.什么是類加載器
ClassLoader就是用來動態(tài)加載class文件到內(nèi)存當中使用
2.類加載類型
BootStrap ClassLoader;啟動類的加載器,負責加載放在jdk一個叫l(wèi)i目錄下的文件,能被虛擬機識別的一個類, 這個類不繼承ClassLoader類,它的底層是c++編寫的
Extension ClassLoader:擴展加載器,主要是負責加載jia(還是jin)目錄下的ext的目錄,可以直接使用這個擴展類加載器
App ClassLoader:應用程序加載器, 負責加載應用用戶路徑下所指定的類,所以可以直接使用這個類加載器
第二個分類(站在java虛擬機的角度)
1.啟動類加載器
BootStrap ClassLoader,c++實現(xiàn),屬于虛擬機內(nèi)的一部分
所有其他的類加載器,java實現(xiàn),獨立于虛擬機之外,繼承ClassLoader,這些加載器需要啟動類加載器 加載完成之后,才能加載其他的類
3.雙親委托模型
圖:
他們之間的父子關(guān)系并不是通過繼承來實現(xiàn)的,而是通過組合關(guān)系來復用 加載器中的代碼
工作流程:比如說 有一個類加載器收到了要加載java的.classw文件要求,它首先不會自己的嘗試加載這個類,而是請求委托給父加載器去完成,所有的加載請求都會傳遞到頂層的啟動類加載器中,只有類加載器在它的搜索范圍內(nèi)沒有找到所需要的類時,它無法完成加載,這時 它的子加載器才會嘗試去加載。
使用雙親委托模型它能組織類加載器之間的關(guān)系,它有一個明顯的好處,java類隨著類加載器一起具備了一種帶層次的關(guān)系,這對于保護程序的穩(wěn)定性非常重要。
4.類加載的過程
圖:
7個階段
加載、驗證、準備、解析、初始化、使用、卸載
加載、驗證、準備、初始化這四個階段是確定的,而解析不是,它在某些情況下可以在初始化階段之后來開始,這是為了能支持java語言的動態(tài)綁定,
使用、卸載 是在所有順序定完了之后再執(zhí)行
靜態(tài)綁定
動態(tài)綁定
第一步:加載
1.通過一個類的全限定名來獲取其定義的二進制字節(jié)流
2.將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為運行時的數(shù)據(jù)結(jié)構(gòu)
3.在Java堆中生成一個代表這個類的java.lang.Class對象,作為對方法區(qū)中這些數(shù)據(jù)的訪問入口
既可以使用系統(tǒng)加載器加載,也可以自定義加載器加載
第二部:驗證
1.為了確保Class文件中的字節(jié)流包含的信息符合當前虛擬機的要求
2.文件格式的驗證、元數(shù)據(jù)的驗證、字節(jié)碼驗證和符號引用驗證
第三部:準備
1.對基本數(shù)據(jù)類型。如果不顯示的賦值,會賦默認值
2.對于同時被static 和final修飾的常量,必須顯示的為其賦值,否則編譯不通過
只被final修飾的變量,可以在類初始化時賦值,不會被默認賦值
3.對于引用數(shù)據(jù)類型 reference,默認值null
4.在數(shù)據(jù)初始化時,如果沒有賦值, 默認數(shù)據(jù)里頭的值是0
第四部:解析
解析階段是虛擬機將常量池中的符號轉(zhuǎn)化為直接引用的過程
圖:
本類-》接口-》父接口-》。。。--》父類-》祖父類-》。。。
類解析、接口解析、類中方法解析、接口中方法解析
1.類和接口的解析
首先判斷鎖轉(zhuǎn)換的直接引用 是數(shù)組類型,還是普通對象類型引用,從而進行不同的解析
2.字段解析
肯定會在本類中查找,是否包含簡單名稱,字段描述都符合的字段,如果有,則查找結(jié)束,如果沒有,按照繼承關(guān)系從上往下一次查找
3.類方法解析。類方法解析的搜索步驟和字段搜索差不多
判斷該方法是類,還是接口的方法。對類的方法的匹配順序,是先搜索父類,再搜索接口
4.接口方法解析
遞歸向上搜索接口
5.初始化
初始化階段是執(zhí)行類構(gòu)造器 方法的過程