什麼是類加載器?

 

類加載器

  什麼是類加載器,作用是什麼?


類加載器就是加載字節碼文件(.class)的類



  Java語言是一種具有動態性的解釋語言,類(CLASS) 只有被加載到 JVM 中後才能運行。當運行指定程序時,JVM會將編譯生成的.class文件按照需求和一定的規則加載到內存中,組織成爲一個完整的Java應用程序。這個加載的過程是由類加載器來完成的,具體來說,就是由ClassLoader和它的子類來實現的。類加載器本身也是一個類,其實質是把類文件從硬盤讀取到內存中!


  類加載的方式分爲隱式加載和顯示加載兩種。隱式加載指的是程序在使用new 等方式創建對象時,會隱式地調用類的加載器把對應的類加載到JVM中。顯式加載式指的是通過直接調用class.forName()方法把所需的類加載到JVM中。


  在Javay語言中,類的加載是動態的,它並不會一次性將所有的類全部加載後再運行,而是保證程序運行的基礎類(例如基類)完全加載到JVM中,至於其他類,則在需要時才加載。在Java語言中,可以把類分成3類:系統類,擴展類,自定義類。Java針對這3種不同的類提供了3中類型的加載器,這3種加載器的關係如下:



1)BootStrap:引導類加載器:加載都是最基礎的文件

2)ExtClassLoader:擴展類加載器:加載都是基礎的文件

3)AppClassLoader:應用類加載器:三方jar包和自己編寫java文件

 

以上這3個類是如何協調工作來完成類的加載呢?

  其實,它們通過委託的方式實現的。具體而言,就是當有類需要被加載時,類加載器會請求父類來完成這個載入工作,父類會使用其自己的搜索路徑來搜索需要被載入的類,如果搜索不到,纔會由子類按照其搜索路徑來搜索待加載的類。


/**
 * Created by Ming on 2017/10/17.
 */
public class TestLoader {


    public static void main(String[] args) {

        ClassLoader classLoader = TestLoader.class.getClassLoader();

        System.out.println(classLoader);

        System.out.println(classLoader.getParent());

        System.out.println(classLoader.getParent().getParent());

    }

}


輸出結果爲:








  可以看出,TestLoader類是由AppClassLoader來加載的。因爲BootStrap Loader類加載器先搜索其指定目錄找不到TestLoader類,其次ExtClassLoader也找不到,最後AppClassLoader在ClassPath找到了TestLoader類。

注意:Bootstrap Loader是用C++語言實現的,所有在Java語言是看不到它,輸出爲null.



類加載器主要步驟分爲以下3步:

1.裝載。(根據查找路徑找到相對應的calss文件,然後導入。)

2.鏈接  (鏈接又分爲3個小步驟:1。檢查:檢查待加載的class文件的正確性。2。準備:給類中的靜態變量分配存儲空間。3。解析:將符號引用轉換成直接引用.)

3.初始化。(對靜態變量和靜態代碼塊執行初始化工作。)




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