類加載器就是用來加載類的對象,而ClassLoader是一個抽象類,只要給出類的二進制名稱,類加載器就能肯定或生成構建這個類的定義;一般是把二進制名稱轉成文件系統的文件名,再讀入這個類文件。bootstrap
每一個類對象都擁有getClassLoader 這個方法;數組
數組建立的類對象不是由類加載器加載的,而是運行時按需加載,對每個數組元素調用類加載器,而元素類型爲原始類型時就沒有類加載器;安全
能夠經過繼承ClassLoader來擴展一些在JVM動態加載過程當中的處理方式網絡
類加載器經常使用於安全管理,指明哪些是安全域併發
ClassLoader使用一種委託模式來查找類和資源,每一個ClassLoader的實例都有本身的父類加載器,當本身要查找類或資源前,ClassLoader先委託父類進行查找 。代理
虛擬機有一個內置的類加載器,bootstrap class loader,它沒有父類加載器,卻能夠當其它類加載器的父類加載器。對象
類加載器支持並行加載,即所謂的併發模式,這個須要類加載在初始化階段調用registerAsParallelCapable 本身註冊;ClassLoader是默認並行的,而它的子類須要主動註冊。繼承
當執行環境中的代理模式層次不清時,類加載須要並行加載,由於類加載進程方法會持有加載鎖,這可能致使死鎖。進程
一般JVM加載都使用平臺依賴的方式從本地加載類,例如UNIX系統,虛擬機是從CLASSPATH環境變量定義的路徑開始加載類;資源
而後還有些類是從網絡生成的,
網絡類加載器的子類必須有如下2個方法,
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
}