如何自己手寫一個熱加載?
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方法是遵循雙親委派的規則的。