類加載器:java
負責將生成的.class文件加載到內存中,並生成對應的Class對象 三種類加載器: BootStrapClassLoader:引導類加載器,負責java核心類的加載 ExtensionClassLoader: 擴展類加載器 AppClassLoader:應用類加載器 負責加載咱們寫的一些類
類加載概述:數據結構
當程序要使用某個類的時候,若是該類尚未被加載到內存中, 系統會經過加載、鏈接和初始化三步來實現對該類的初始化。 加載:將class文件中的二進制數據數據讀入到內存中, 而後將該字節流所表明的靜態存儲結構轉換爲方法區中運行的數據結構, 最終建立一個Class對象,任何類使用時系統都會建立該類的Class對象 鏈接: 驗證:確保class文件中字節流包含的信息符合當前虛擬機的要求 文件格式的驗證:驗證是否符合Class文件格式的規範 元數據的驗證:對字節碼描述的信息進行語法校驗 字節碼驗證:驗證程序的控制流程 符號引用驗證:發生在虛擬機將二進制符號轉換爲直接引用的時候 準備:爲類變量分配內存並設置初始值。這些變量使用的內存都在方法區中分配。 這時候分配的內存僅包括類變量(靜態變量),實例變量會在對象實例化的時候 隨着對象一塊兒分配在堆內存中 解析:將二進制符號的引用替換爲直接引用 初始化:父類靜態(靜態的成員變量,靜態代碼塊), 子類靜態(子類靜態成員變量,子類的靜態代碼塊) 父類非靜態(非靜態成員變量,構造代碼塊,構造函數) 子類非靜態(子類非靜態成員變量,子類構造代碼塊,子類構造函數)
靜態語句塊只能訪問定義到靜態語句塊以前的變量,定義在以後的變量,只可以賦值,不可以訪問函數
static{ num = 100; System.out.println(num);//編譯不經過 } private static int num = 10;
類加載器的加載機制:code
雙親委託機制 當一個類加載器調用loadClass以後,並不會直接加載, 而是先交給當前類加載器的父加載器加載,直到最頂層的父加載器。 只有當父加載器沒法完成加載的時候,子加載器纔會嘗試本身加載。 破壞雙親委託機制:實現熱部署