### 類加載的時機
* 隱式加載 new 創建類的實例,
* 顯式加載:loaderClass,forName等
* 訪問類的靜態變量,或者為靜態變量賦值
* 調用類的靜態方法
* 初始化某個類的子類
* 使用反射方式創建某個類或者接口對象的Class對象
* 直接使用`java.exe`命令來運行某個主類
### 類加載過程
加載->驗證->準備->解析->初始化

- **加載**
類加載過程的一個階段,ClassLoader通過一個類的完全限定名查找此類字節碼文件,并利用字節碼文件創建一個class對象。
- **驗證**
目的在于確保class文件的字節流中包含信息符合當前虛擬機要求,不會危害虛擬機自身的安全,主要包括四種驗證:文件格式的驗證,元數據的驗證,字節碼驗證,符號引用驗證。
- **準備**
為類變量(static修飾的字段變量)分配內存并且設置該類變量的初始值,(如static int i = 5 這里只是將 i 賦值為0,在初始化的階段再把 i 賦值為5),這里不包含final修飾的static ,因為final在編譯的時候就已經分配了。這里不會為實例變量分配初始化,類變量會分配在方法區中,實例變量會隨著對象分配到Java堆中。
- **解析**
這里主要的任務是把常量池中的符號引用替換成直接引用
- **初始化**
這里是類記載的最后階段,如果該類具有父類就進行對父類進行初始化,執行其靜態初始化器(靜態代碼塊)和靜態初始化成員變量。(前面已經對static 初始化了默認值,這里我們對它進行賦值,成員變量也將被初始化)
* [ ] 雙親委派模式
如果一個類收到了類加載的請求,它并不會自己先去加載,而是把這個請求委托給父類加載器去執行,如果父類加載器還存在父類加載器,則進一步向上委托,依次遞歸,請求最后到達頂層的啟動類加載器,如果弗雷能夠完成類的加載任務,就會成功返回,倘若父類加載器無法完成任務,子類加載器才會嘗試自己去加載,這就是雙親委派模式。就是每個兒子都很懶,遇到類加載的活都給它爸爸干,直到爸爸說我也做不來的時候,兒子才會想辦法自己去加載。

* [ ] 自定義類加載器
一般需要繼承java.lang.ClassLoader類并重寫其findclass方法。
*****
引用自 https://www.cnblogs.com/czwbig/p/11127222.html
https://blog.csdn.net/weixin_40236948/article/details/88072698
- 2111總結
- 1.面向對象
- 1.0.1 super()與this()的區別
- 1.0.2 private、default、protected、public的訪問范圍
- 1.0.3 continue、break、return區別
- 1.0.4 重載和重寫的區別
- 1.0.5 final的特點
- 1.0.6 抽象類與接口的區別
- 1.0.7 java類型
- 1.0.8 什么是反射
- 1.0.9 類的加載機制
- 1.1.1 jvm內存結構
- 1.1.2 java垃圾回收機制
- 1.1.3 并發問題
- 1.1.3.1 線程的狀態與關系
- 1.1.3.2 并發的三大性質
- 1.1.3.3 線程的實現與使用
- 1.1.3.4 線程池相關
- 1.1.3.5 并發相關方法
- 1.1.3.6 線程相關工具
- 1.1.4 jdk8特性
- 1.1.4.1 lambad表達式的使用
- 1.1.4.2 stream API
- 1.1.4.3 Optional容器使用
- 1.1.4.4 LocalDateTime
- 1.15 io流
- 1.16 動態代理實現
- 2.JavaEE
- 2.0.1 JSP四大作用域九大內置對象
- 2.0.2 cookie與session的區別
- 4.數據庫相關
- 5.git版本管理
- 7.一些問題解決
- 7.1 分布式鎖如何實現