一、類的加載概述和加載時機
1.加載概述
當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過加載、連接、初始化三步來實現對這個類進行初始化。
①加載
- 就是指將class文件讀入內存,併爲之創建一個Class對象。任何類被使用時系統都會建立一個Class對象
②連接
- 驗證 是否有正確的內部結構,並和其他類協調一致
- 準備 負責爲類的靜態成員分配內存,並設置默認初始化值(靜態成員隨類的加載而加載)
- 解析 將類的二進制數據中的符號引用替換爲直接引用
③初始化
- 默認初始化,構造函數初始化等
2.加載時機
- 創建類的實例
- 訪問類的靜態變量,或者爲靜態變量賦值
- 調用類的靜態方法
- 使用反射方式來強制創建某個類或接口對應的java.lang.Class對象
- 初始化某個類的子類
- 直接使用java.exe命令來運行某個類
二、類加載器
1.概述
負責將.class文件加載到內存中,併爲之生成對應的Class對象。雖然我們不需要關心類加載機制,但是瞭解這個機制就能更好的理解程序的運行
2.分類
- Bootstrap ClassLoader 根類加載器
- Extension ClassLoader 擴展類加載器
- System ClassLoader 系統類加載器
3.作用
- Bootstrap ClassLoader 根類加載器
也被成爲引導類加載器,負責JAVA核心類的加載
比如System,String等,在JDK中JRE的lib目錄下rt.jar文件中
- Extension ClassLoader 擴展類加載器
負責JRE的擴展目錄中jar包的加載
在JDK中JRE的lib目錄下ext目錄
- System ClassLoader 系統類加載器
負責在JVM啓動時加載來自java命令的class文件,以及classpath環境變量所指定的jar包和類路徑