Java ClassLoader 簡述Java中的類從被載入到記憶體中到卸載出記憶體為止,一共經歷了七個階段:載入、驗證、準備、解析、初始化、使用、解除安裝
載入和初始化這兩步在載入的階段,虛擬機器需要完成以下三件事:
1.透過一個類的全限定名來獲取定義此類的二進位制位元組流
2.將這個位元組流所代表的的靜態儲存結構轉化為方法區的執行時資料結構
3.在記憶體中生成一個代表這個類的java.lang.Class物件,作為方法區這個類的各種資料的訪問入口。這三步都是透過類載入器來實現的。而官方定義的Java類載入器有BootstrapClassLoader、ExtClassLoader、AppClassLoader。這三個類載入器分別負責載入不同路徑的類的載入。並形成一個父子結構。(預設情況下,例如我們使用關鍵字new或者Class.forName都是透過AppClassLoader類載入器來載入的)
初始化
1.當我們要使用一個類的執行方法或者屬性時,類必須是載入到記憶體中並且完成初始化的。類初始化有以下幾種情況使用new關鍵字例項化物件的時候、讀取或者設定一個類的靜態欄位、以及呼叫一個類的靜態方法。
2.使用java.lang.reflect包的方法對類進行反射呼叫時,如果類沒有進行初始化,那麼先進行初始化。
4.初始化一個類的時候,如果發現其父類沒有進行初始化,則先觸發父類的初始化。當虛擬機器啟動時,使用者需要制定一個執行的主類(包含main()方法的那個類)虛擬機器會先初始化這個主類。
如何實現熱載入?
在上面我們知道了在預設情況下,類載入器是遵循雙親委派規則的。所以我們要實現熱載入,那麼我們需要載入的那些類就不能交給系統載入器來完成。所以我們要自定義類載入器來寫我們自己的規則。
實現自己的類載入器
要想實現自己的類載入器,只需要繼承ClassLoader類即可。而我們要打破雙親委派規則,那麼我們就必須要重寫loadClass方法,因為預設情況下loadClass方法是遵循雙親委派的規則的。
Java ClassLoader 簡述Java中的類從被載入到記憶體中到卸載出記憶體為止,一共經歷了七個階段:載入、驗證、準備、解析、初始化、使用、解除安裝
載入和初始化這兩步在載入的階段,虛擬機器需要完成以下三件事:
1.透過一個類的全限定名來獲取定義此類的二進位制位元組流
2.將這個位元組流所代表的的靜態儲存結構轉化為方法區的執行時資料結構
3.在記憶體中生成一個代表這個類的java.lang.Class物件,作為方法區這個類的各種資料的訪問入口。這三步都是透過類載入器來實現的。而官方定義的Java類載入器有BootstrapClassLoader、ExtClassLoader、AppClassLoader。這三個類載入器分別負責載入不同路徑的類的載入。並形成一個父子結構。(預設情況下,例如我們使用關鍵字new或者Class.forName都是透過AppClassLoader類載入器來載入的)
初始化
1.當我們要使用一個類的執行方法或者屬性時,類必須是載入到記憶體中並且完成初始化的。類初始化有以下幾種情況使用new關鍵字例項化物件的時候、讀取或者設定一個類的靜態欄位、以及呼叫一個類的靜態方法。
2.使用java.lang.reflect包的方法對類進行反射呼叫時,如果類沒有進行初始化,那麼先進行初始化。
4.初始化一個類的時候,如果發現其父類沒有進行初始化,則先觸發父類的初始化。當虛擬機器啟動時,使用者需要制定一個執行的主類(包含main()方法的那個類)虛擬機器會先初始化這個主類。
如何實現熱載入?
在上面我們知道了在預設情況下,類載入器是遵循雙親委派規則的。所以我們要實現熱載入,那麼我們需要載入的那些類就不能交給系統載入器來完成。所以我們要自定義類載入器來寫我們自己的規則。
實現自己的類載入器
要想實現自己的類載入器,只需要繼承ClassLoader類即可。而我們要打破雙親委派規則,那麼我們就必須要重寫loadClass方法,因為預設情況下loadClass方法是遵循雙親委派的規則的。