1. 程式人生 > >九、請介紹類載入過程,什麼是雙親委派模型?

九、請介紹類載入過程,什麼是雙親委派模型?

一、類載入

1.什麼是類載入?

JVM將編譯好的.class檔案(位元組碼檔案)以二進位制流的方式載入到我們記憶體中,並且將二進位制流中靜態的資料結構轉換成我們方法區中動態執行資料結構,並且在對堆記憶體生成一個java.lang.class物件,作為提供給外界訪問我們方法區動態執行資料結構的一個入口。

2.類載入器有哪些?

主要的就是啟動類載入器(BootStrap ClassLoader)和其他所有類載入器。

注意:啟動類載入器是虛擬機器的一部分,是由c++實現的,其它類載入器是獨立於虛擬機器外的一部分,都繼承了抽象類java.lang.ClassLoader。

類載入器主要分為以下四部分:

啟動類載入器:

擴充套件類載入器:

應用類載入器:

使用者自定義類載入器

如下圖所示:

二、什麼是雙親委派模型?

當需要載入一個類的時候,子類載入器並不會馬上去載入,而是依次去請求父類載入器載入,一直往上請求到最高類載入器:啟動類載入器。當啟動類載入器載入不了的時候,依次往下讓子類載入器進行載入。當達到最底下的時候,如果還是載入不到該類,就會出現ClassNotFound的情況。

好處:保證了程式的安全性。例子:比如我們重新寫了一個String類,載入的時候並不會去載入到我們自己寫的String類,因為當請求上到最高層的時候,啟動類載入器發現自己能夠載入String類,因此就不會載入到我們自己寫的String類了。

三、類載入的過程(5步)

載入:將java原始碼編譯後的.class位元組碼檔案以二進位制流的方式載入進記憶體

連線  

       驗證:驗證載入進來的二進位制流是否符合虛擬機器的規範,不會危害的虛擬機器自身的安全

       準備:給類變數(靜態變數)賦予初始值,基本資料/引用型別資料

       解析:將字串引用轉換為直接引用

初始化:變數賦予初始值、執行靜態語句塊、執行建構函式等等。