顧名思義,類加載器(class loader)用來加載 Java 類到 Java 虛擬機中。通常來講,Java 虛擬機使用 Java 類的方式以下:Java 源程序(.java 文件)在通過 Java 編譯器編譯以後就被轉換成 Java 字節代碼(.class 文件)。類加載器負責讀取 Java 字節代碼,並轉換成 java.lang.Class類的一個實例。每一個這樣的實例用來表示一個 Java 類。經過此實例的 newInstance()方法就能夠建立出該類的一個對象。實際的狀況可能更加複雜,好比 Java 字節代碼多是經過工具動態生成的,也多是經過網絡下載的。
基本上全部的類加載器都是 java.lang.ClassLoader類的一個實例。下面詳細介紹這個 Java 類。
java.lang.ClassLoader類介紹
java.lang.ClassLoader類的基本職責就是根據一個指定的類的名稱,找到或者生成其對應的字節代碼,而後從這些字節代碼中定義出一個 Java 類,即 java.lang.Class類的一個實例。
ClassLoader提供了一系列的方法,比較重要的方法如:
方法 說明
getParent() 返回該類加載器的父類加載器。
loadClass(String name) 加載名稱爲 name的類,返回的結果是 java.lang.Class類的實例。
findClass(String name) 查找名稱爲 name的類,返回的結果是 java.lang.Class類的實例。
findLoadedClass(String name) 查找名稱爲 name的已經被加載過的類,返回的結果是 java.lang.Class類的實例。
defineClass(String name, byte[] b, int off, int len) 把字節數組 b中的內容轉換成 Java 類,返回的結果是 java.lang.Class類的實例。這個方法被聲明爲 final的。
resolveClass(Class c) 連接指定的 Java 類。
類加載器的樹狀組織結構
Java 中的類加載器大體能夠分紅兩類,一類是系統提供的,另一類則是由 Java 應用開發人員編寫的。系統提供的類加載器主要有下面三個:
引導類加載器(bootstrap class loader):它用來加載 Java 的核心庫,是用原生代碼來實現的,並不繼承自java.lang.ClassLoader。
擴展類加載器(extensions class loader):它用來加載 Java 的擴展庫。Java 虛擬機的實現會提供一個擴展庫目錄。該類加載器在此目錄裏面查找並加載 Java 類。
系統類加載器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來加載 Java 類。通常來講,Java 應用的類都是由它來完成加載的。能夠經過 ClassLoader.getSystemClassLoader()來獲取它。
除了系統提供的類加載器之外,開發人員能夠經過繼承 java.lang.ClassLoader類的方式實現本身的類加載器,以知足一些特殊的需求。
除了引導類加載器以外,全部的類加載器都有一個父類加載器。經過 上面表中給出的 getParent()方法能夠獲得。對於系統提供的類加載器來講,系統類加載器的父類加載器是擴展類加載器,而擴展類加載器的父類加載器是引導類加載器;對於開發人員編寫的類加載器來講,其父類加載器是加載此類加載器 Java 類的類加載器。由於類加載器 Java 類如同其它的 Java 類同樣,也是要由類加載器來加載的。通常來講,開發人員編寫的類加載器的父類加載器是系統類加載器。類加載器經過這種方式組織起來,造成樹狀結構。樹的根節點就是引導類加載器。下圖中給出了一個典型的類加載器樹狀組織結構示意圖,其中的箭頭指向的是父類加載器java