ClassLoader工做機制

1、ClassLoader概念

  ClassLoader是用來動態的加載class文件到虛擬機中,並轉換成java.lang.class類的一個實例,每一個這樣的實例用來表示一個java類,咱們能夠根據Class的實例獲得該類的信息,並經過實例的newInstance()方法建立出該類的一個對象,除此以外,ClassLoader還負責加載Java應用所需的資源,如圖像文件和配置文件等。java

  ClassLoader類是一個抽象類。若是給定類的二進制名稱,那麼類加載器會試圖查找或生成構成類定義的數據。通常策略是將名稱轉換爲某個文件名,而後從文件系統讀取該名稱的「類文件」。ClassLoader類使用委託模型來搜索類和資源。每一個 ClassLoader實例都有一個相關的父類加載器。須要查找類或資源時,ClassLoader實例會在試圖親自查找類或資源以前,將搜索類或資源的任務委託給其父類加載器。  數據結構

  注意:程序在啓動的時候,並不會一次性加載程序所要用的全部class文件,而是根據程序的須要,經過Java的類加載機制來動態加載某個class文件到內存中。函數

2、JVM平臺提供三層classLoader

  1. Bootstrap classLoader:採用native code實現,是JVM的一部分,主要加載JVM自身工做須要的類,如java.lang.*、java.uti.*等; 這些類位於$JAVA_HOME/jre/lib/rt.jar。Bootstrap ClassLoader不繼承自ClassLoader,由於它不是一個普通的Java類,底層由C++編寫,已嵌入到了JVM內核當中,當JVM啓動後,Bootstrap ClassLoader也隨着啓動,負責加載完核心類庫後,並構造Extension ClassLoader和App ClassLoader類加載器。
  2. ExtClassLoader:擴展的class loader,加載位於$JAVA_HOME/jre/lib/ext目錄下的擴展jar。
  3. AppClassLoader:系統class loader,父類是ExtClassLoader,加載$CLASSPATH下的目錄和jar;它負責加載應用程序主函數類。

  其體系結構圖以下 this

  

 

  若是要實現本身的類加載器,無論是實現抽象列ClassLoader,仍是繼承URLClassLoader類,它的父加載器都是AppClassLoader,由於無論調用哪一個父類加載器,建立的對象都必須最終調用getSystemClassLoader()做爲父加載器,getSystemClassLoader()方法獲取到的正是AppClassLoader。spa

  注意:Bootstrap classLoader並不屬於JVM的等級層次,它不遵照ClassLoader的加載規則,Bootstrap classLoader並無子類。.net

、JVM加載class文件到內存有兩種方式

  1. 隱式加載:不經過在代碼裏調用ClassLoader來加載須要的類,而是經過JVM來自動加載須要的類到內存,例如:當類中繼承或者引用某個類時,JVM在解析當前這個類不在內存中時,就會自動將這些類加載到內存中。
  2. 顯示加載:在代碼中經過ClassLoader類來加載一個類,例如調用this.getClass.getClassLoader().loadClass()或者Class.forName()。

4、ClassLoader加載類的過程

  1. 找到.class文件並把這個文件加載到內存中
  2. 字節碼驗證,Class類數據結構分析,內存分配和符號表的連接
  3. 類中靜態屬性和初始化賦值以及靜態代碼塊的執行

 

5、類的執行順序

  • 類的實例化是指:建立一個類的實例(對象)的過程;
  • 類的初始化是指:爲類中各個類成員(被static修飾的成員變量)賦初始值的過程,是類生命週期中的一個階段。3d

     

 

 

 

 參考:code

  https://blog.csdn.net/u014634338/article/details/81434327 對象

相關文章
相關標籤/搜索