類加載器ClassLoader

java中的類加載器做用:將java類的字節碼加載到java虛擬機(JVM)中。java


bootstrap:虛擬機的內置類加載器(稱爲 "bootstrap class loader")自己沒有父類加載器,可是能夠將它用做 ClassLoader 實例的父類加載器,也就是類加載器的父類加載器。
bootstrap


ExtClassLoader:負責記載G:\Java\jdk1.6.0\jre\lib\ext\*.jar下的類。(這裏的路徑是我安裝jdk的路徑)。數組


AppClassLoader:負責加載classpath路徑下的類。安全


自定義類加載器:(自定義加載路徑)app

class 類名 extends ClassLoader {    public Class findClass(String name) {
             byte[] b = loadClassData(name);    //經過字節碼數組轉換爲Class類實例
             return defineClass(name, b, 0, b.length);
         } //獲取字節碼數組(自定義的)
         private byte[] loadClassData(String name) {
            
         }     }

自定義的類加載器能夠將java代碼混淆,也就是編譯源碼的時候先經過本身定義的加密規則編譯,而後類加載器加載類的時候按照解密規則加載,這樣能夠增長代碼的安全性,可是加載效率下降了。
加密

類加載器使用委託機制加載類的,每一個 ClassLoader 實例都有一個相關的父類加載器。須要查找類或資源時,ClassLoader 實例會在試圖親自查找類或資源以前,將搜索類或資源的任務委託給其父類加載器。個人理解是這樣的:假如咱們要加載一個類,那麼咱們是否是應該先加載一個類加載器呢?而咱們類加載器的加載是否是也須要一個類加載器去加載它,纔會建立一個他的實例去供java虛擬機調用並加載其餘的類,因此加載一個類的時候是從bootstrap——>extclassload——>appclassloader——>自定義類加載器,從上往下開始去加載這個類的,若是類加載器找到了就會返回這個類的實例,沒有找到就會交給他的下一級去找。(注意:類加載的發起者不會交由它的子類去加載。假如是從appclassloader發起的,那麼若是在appclassloader類加載器尚未找到這個類的,那麼就會拋出找不到類的異常,而不會再交給它的子類去加載這個類)。spa

相關文章
相關標籤/搜索