類加載機制


一、類的加載可以分為加載、連接、初始化 三個步驟

類的加載

  • 1、類的加載指的是將類的class文件加載到內存中,並且為之創建一個java.lang.Class對象。
  • 2、JVM提供類加載器去加載類。JVM提供的類加載器通常稱為系統類加載器,可以繼承ClassLoader基類去創建自己的類加載器。
  • 3、程序中所有的類實際上也是實例,他們都是java.lang.Class實例。
  • 4、使用不同的類加載器可以從不同來源來加載類的二進制數據(本地文件系統、JAR包、網絡、java源文件動態編譯進行加載)。

類的連接:

  • 1、連接階段負責把類的二進制文件數據合並到JRE中。
  • 2、可以分為三個階段:
  1. 驗證:驗證類結構,是否和其他類協調一致。
  2. 准備:為類的類變量分配內存,設置默認初始值。
  3. 解析:將類的二進制文件中的符號引用替換為直接引用。

類的初始化:

  • 1、主要對類變量初始化,(聲明類變量時指定初始值、使用靜態初始化塊)。
  • 2、步驟:
  1. 當這個類沒有加載和連接,則先加載並且連接。
  2. 當這個類的直接父類沒有被初始化,則先初始化。
  3. 當類中有初始化語句,則系統依次執行初始化語句。
  • 3、類初始化時機:
  1. 創建類的實例(new、反射、反序列化)。
  2. 調用某個類的靜態方法。
  3. 訪問某個類或者接口的類變量,或者為該類變量賦值。
  4. 初始化某個類的子類。

注意:對於一個final型的類變量,如果在編譯時期能確定其值,則java編譯器在編譯時期就會在這個類變量出現的地方替換成它的值。那么程序使用該
靜態變量也不是導致初始化。


二、類加載器

  • 1、一旦一個類被加載到JVM中,同一個類就不會被載入了,這里同一個類是指:

  一個類用全限定類名作為標識,在jvm中,一個類用全限定類名和其類加載器作為唯一標識,

  • 2、JVM啟動時會形成三個類加載器組成的初始類加載器層次結構:
  1. Bootstrap ClassLoader :根類加載器,負責加載Java的核心類比如rt.jar,由jvm自身實現,不是java.lang.ClassLoader的子類。
  2. Extension ClassLoader : 擴展類加載器,負責加載jre的擴展目錄,.\jre1.8.0_181\lib\ext 中的類。
  3. System ClassLoader :系統類加載器,負責加載由CLASSPATH環境變量所指定的jar包和類路徑。
  • 3、類加載機制:
  1. 全盤負責:當一個類加載器負責一個類的加載時,該類所依賴的和引用的其他類也將由該類加載器負責載入,除非顯示聲明。
  2. 父類委托:嘗試讓父類加載器加載,當父類加載器無法加載時才讓從自己的類路徑中加載。
  3. 緩存機制:所有加載過的Class都會被緩存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM