Java 類加載過程 和 類的加載器ClassLoader(重點)

一、類的加載過程

綜述:

1.加載
2.連接
(2.1)驗證
(2.2)準備
(2.3)解析
3.初始化
在這裏插入圖片描述

1. 加載(二、類的加載器class的作用)

  • 一、ClassLoader類加載器的作用:
  1. 將編譯器生成的.class文件加載到內存中,
  • 將硬盤中的靜態數據轉化爲內存中方法區的動態數據

就是下圖的過程.classLoader

在這裏插入圖片描述

2. 鏈接(2.2準備很重要)

2.1.驗證(就是判斷編譯是否能通過.)
(1)保證加載進來的字節流符合JVM的規範,不會造成安全錯誤
(2)驗證文件格式:比如常量final中是否有不支持的常量,文件是否規範
(3)驗證元數據:是否有繼承被final修飾的類(有就報錯error),類中的字段,方法是否和父類衝突,是否出現不合理的重載Override
(4) 對字節碼的驗證,保證程序語義的合理性,比如保證轉換類型的合理(比如 int 賦值給 short 就報錯)
(5)對符號引用的 驗證,

2.2.準備(重要!)

(1)給類變量(static修飾的)(不是實例變量非static修飾)分配內存**(方法區,初始化默認值(private static int age = 0 )
類變量實例變量局部變量的區別
(2)方法區
(3)常量:
常量儲存在方法區,且默認值爲自定的值**(private static final float PI = 3.14f)

2.3.解析(將常量池中的符號引用替換爲直接引用)
(1)符號引用:就是 final float PI 中的 PI 就是符號
(2)直接引用:final float PI 的 PI的方法區的地址2341410x 就是直接引用
(3)解析階段,JVM會吧所有的類名,方法名,字段名,的符號引用替換爲內存地址的直接引用。

3.初始化 (重要)

只對static修飾的變量、或者static修飾的代碼塊{}構造代碼塊、初始化(private static int age = 18)

  • 初始化一個類的時候能如果父類沒有初始化,就先初始化父類
  • 如果同時多個靜態代碼塊(構造代碼塊)或者靜態變量 按順序 初始化.

注意區別構造函數 Person() 的初始化是在 運行期間 new 的時候 初始化實例的 ,這個static 構造代碼塊的初始化是在 類加載的時候運行的 .

二、什麼是類加載器ClassLoader?

https://blog.csdn.net/xyang81/article/details/7292380

1. 作用

 * 一、ClassLoader類加載器的作用:
 * 1. 將編譯器生成的.class文件加載到內存中,
 * 將硬盤中的靜態數據轉化爲內存中方法區的動態數據

2.上圖

哪個紅裏透綠的就是類加載器ClassLoader了
在這裏插入圖片描述

3.類的緩存機制

 * 二、類的緩存機制:
 * 1. 標準的JavaSE類加載器可以按要求查找類,但一旦某個類被加載到類加載器中,
 * 它將維持一段時間,(緩存)不過就JVM的垃圾回收機制可以回收這些Class對象。
 * `

類加載器的分類:

1. 分類3

 * 三、ClassLoader分類
 * 1. 引導類加載器null:--------- 核心內褲
 * 負責Java的核心自帶類庫,無法使用方法直接獲取 rt.jar
 *
 * 2. (平臺)加載器Platform:-----------ext/拓展內褲
 * jre/lib/ext 目錄下的jar包
 *
 * 3.  (應用)加載器App,------自己寫的類
 * 加載自所有權限public --private類,最常用。
 * `

2. 關係如圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章