類加載器就是負責檢索並加載其餘Java類或者資源(如文件)的對象,它通常繼承於java.lang.ClassLoader這個抽象類(除了BootstrapClassLoader)。java
實際上,程序中全部的類都是經過類加載器進行加載的,而且它們都持有各自類加載器對象的引用,能夠經過java.lang.Class的getClassLoader方法獲得。mysql
一個程序中的各個類加載器構成了一棵樹,位於根部的被稱做BootstrapClassLoader,它做爲Java虛擬機的一部分,它使用C++語言實現,在程序剛啓動時就被加載進來,負責Java標準庫的加載,而且只有它能完成該任務。程序員
標準擴展(Extension)類加載器負責加載Java_Home /lib/ext或者由系統變量 java.ext.dir指定位置中的類庫sql
應用程序(Application)類加載器負責加載系統類路徑(CLASSPATH)中指定的類庫。同時它常被稱爲系統(System)加載器,由於咱們能夠經過getSystemClassLoader()方法來獲取它。數據庫
而由咱們程序員本身編寫的類加載器被稱爲自定義類加載器,若是生成自定義類加載器時沒有明確地指出父類加載器,會默認把應用程序(Application)類加載器做爲本身的父親。oracle
類加載器的父子關係至關重要,當你指定由一個類加載器加載某一個類時,它會不管如何先把它交給本身的父類加載器來執行,除非父類加載器檢索不到這個類,纔會開始嘗試本身檢索和加載。url
顯式使用類加載器的最多見例子就是使用JDBC的第一步——加載數據庫驅動,如:spa
Class.forName("com.mysql.jdbc.Driver");
或者.net
Class.forName("oracle.jdbc.driver.OracleDriver");
思路很簡單,把指定目錄追加到類加載器的類路徑中便可。code
public static ClassLoader createClassLoader(String dirname) throws java.io.IOException { java.net.URL[] url = new java.net.URL[1]; java.io.File file; if (dirname.endsWith("/")) { file = new java.io.File(dirname); } else { // 對於目錄的路徑,最後必需要有'/' file = new java.io.File(dirname + "/"); } url[0]= file.toURI().toURL(); ClassLoader parent = ClassLoader.getSystemClassLoader(); java.net.URLClassLoader loader = new java.net.URLClassLoader(url, parent); return loader; }
下面以一個實例演示如何使用該類加載器,首先建立一個class目錄的類加載器,而後獲取test.Main類對象,並調用它的main方法。
private void foo() throws Exception { ClassLoader loader = createClassLoader("./class/"); Class<?> cls = Class.forName("test.Main", true, loader); java.lang.reflect.Method method = cls.getMethod("main", new Class[]{String[].class}); method.invoke(null, new Object[]{null}); }
雖然此次演示的是目錄,但對於jar文件和zip文件一樣能夠經過URLClassLoader來加載。