1、類加載步驟
加載-》驗證-》準備-》解析-》初始化-》使用-》卸載
鏈接:驗證-》準備-》解析
初始化時機:
1)new、invoke指令
2)java.lang.refect反射調用
3)初始化子類時,如果父類沒初始化,則觸發父類初始化。
2、類加載過程
2.1 加載
1)通過類的全限定名獲取二進制字節流
2)將字節流所代表的靜態結構轉化爲方法區的運行時數據結構
3)在內存中生成一個代表這個類的java.lang.Class對象,作爲方法區這個類的各種數據入口。
2.2 驗證
1)文件格式驗證
2)元數據驗證
3)字節碼驗證
4)符號引用驗證
2.3 準備
正式爲類變量分配內存並設置類變量初始值(零值)
2.4 解析
將常量池的符號引用替換爲直接引用
2.5 初始化
執行init()和static{}
3、類加載器
3.1 雙親委派模型
1)Boostrap ClassLoader:加載java_home/lib/rt.jar
2)擴展類加載類:加載java_home/lib/ext/*.jar
3)應用程序類加載類:加載classpath的類
4)自定義類加載器
在類加載器加載類之前,先看父類加載器能不能加載,如果能加載,則用父類加載器加載,否則才自已加載。