目錄
類加載器子系統概述
1. 類加載子系統負責從文件系統或者網絡中加載Class文件,class文件在文件開頭有特定的文件標識
2.ClassLoader只負責class文件的加載,至於它是否可以運行,則有Execution Engine決定。
3.加載的類信息存放於一塊稱爲方法區的內存空間。除了類的信息外,方法區中還會存放運行時常量池信息,可能還包括字符串字面量和數字常量(這部分常量信息是Class文件中常量池部分的內存映射)
運行時常量池信息:
程序編譯成class 文件後 運行javap命令 反編譯後的Constant pool部分的數據
類加載分爲三步
加載
1.通過一個類的全限定名獲取定義此類的二進制字節流
2.將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構
3.在內存中生成一個代表這個類的java.lang.Class對象,作爲方法區這個類的各種數據的訪問入口
這裏是按需加載 如果沒有使用這個類是不會被加載的 (也就表示類中的靜態不會不會被加載)
鏈接
準備:主要做的就是爲由static修飾的成員變量分配內存,並設置默認的初始值
默認初始值如下:
1.八種基本數據類型默認的初始值是0
2.引用類型默認的初始值是null
3.有static final修飾的會直接賦值,例如:static final int x=10;則默認就是10.
初始化
初始化這個階段就是將靜態變量(類變量)賦值的過程,即只有static修飾的才能被初始化,執行的順序就是:父類靜態域或着靜態代碼塊,然後是子類靜態域或者子類靜態代碼塊(靜態代碼塊先被加載,然後再是靜態屬性)
類加載器的分類
JVM支持兩種類型的類加載器,分別是引導類加載器(Bootstrap ClassLoader) 和自定義類加載器(User-Define ClassLoader)
繼承ClassLoader的類加載器都劃分爲自定義類加載器
加載器加載那些範圍的類
對於用戶自定義的類來說,默認使用系統類加載器進行加載
雙親委派機制
Java虛擬機對class文件採用的是按需加載的方式,也就是說當需要使用該類時纔會將它的class文件加載到內存生成class文件,而且加載某個類的class文件時,java虛擬機採用的是雙親委派模式,即把請求交由父類處理,它是一種任務委派模式。
如果是 新建一個 lava.lang.String 類的話 按照雙親委派機制 是不會被加載的 在String中調用main方法會報錯: main方法沒有被定義
如果是新建一個 lava.lang.hello 類的話 在hello中調用main方法會報錯:Prohibited package java.String
優勢就是避免類的重複加載,保護程序安全,防止核心API被隨意篡改