類裝載器是尋找類的字節碼(也就是class文件)文件並構造出類在JVM內部表示的對象組件。
類裝載器把一個類裝入JVM三個步驟
1、裝載:查找導入class文件
2、鏈接:校驗、準備、解析(可選)
校驗:檢查載入class文件的正確性
準備:給類的靜態變量分配存儲空間
解析:將符號引用轉成直接引用
3、初始化:對靜態變量、靜態代碼塊執行初始化工作
ClassLoader是java 的一個運行時系統組件,負責裝載class文件。JVM運行時會產生三個ClassLoader:根裝載器、ExtClassLoader(擴展類裝載器)、AppClassLoader(系統類裝載器)。這三個類存在父子層級關係,即根裝載器是ExtClassLoader的父裝載器,ExtClassLoader是AppClassLoader的父裝載器。默認情況下使用AppClassLoader。
其中根裝載器不是ClassLoader的子類,它是用C++編寫的,在java中找不到它,它負責裝載jre的核心類庫,如rt.jar、charsets.jar等。
ExtClassLoader負責裝載jre擴展目錄下的jar包。
AppClassLoader負責裝載ClassPath路徑下的類包。
Java裝載類使用“全盤負責委託機制”。“全盤負責”是指當一個ClassLoder裝載一個類時,除非顯示的使用另外一個ClassLoder,該類所依賴及引用的類也由這個ClassLoder載入;“委託機制”是指先委託父類裝載器尋找目標類,只有在找不到的情況下才從自己的類路徑中查找並裝載目標類。這一點是從安全方面考慮的,試想如果一個人寫了一個惡意的基礎類(如java.lang.String)並加載到JVM將會引起嚴重的後果,但有了全盤負責制,java.lang.String永遠是由根裝載器來裝載,避免以上情況發生。
除了JVM默認的三個ClassLoder以外,第三方可以編寫自己的類裝載器,以實現一些特殊的需求。類文件被裝載解析後,在JVM中都有一個對應的java.lang.Class對象,提供了類結構信息的描述。數組,枚舉及基本數據類型,甚至void都擁有對應的Class對象。
網上有個大牛有更詳細的關於類裝載器的介紹,網址http://blog.csdn.net/hudashi/article/details/7062850 http://blog.csdn.net/hudashi/article/details/7062849