關於JVM的ClassLoader(轉)

 

     衆所周知,java是編譯型的語言,寫的是java文件,最後運行的是class文件,class文件是運行在JVM之中的,這時候就有一個問題,JVM如何裝載class文件的?是經過ClassLoader來進行的,這裏作一下筆記,由於發現原做者寫的很好《深刻分析java web 技術內幕》。java

ClassLoader的結構分析 web

    ClassLoader是一個抽象類,他有不少子類,JVM默認有幾個實現類,固然咱們也能夠本身繼承ClassLoader。安全

    一、defineClass:將byte字節轉換爲JVM可以識別的Class對象,這樣就意味着能夠是class文件也但是是網絡上的字節流了;網絡

    二、defineClass一般和findClass一塊兒使用,findClass的做用是取得要加載的類的字節碼;數據結構

    三、若是想在類被加載到JVM的時候就被連接,能夠調用resolveClass來完成;this

    四、若是不想自定義加載類的規則,也沒有複雜的邏輯,能夠經過this.getClass().getClassLoader().loadClass("") 來進行加載;spa

 

ClassLoader中的幾個實現類 對象

    一、Bootstrap ClassLoader 這個是JVM加載自身工做須要的類,徹底由JVM本身來控制,外部沒法訪問到這個;blog

    二、ExtClassLoader比較特殊的,服務的特定目標在System.getProperty("java.ext.dirs");繼承

    三、AppClassLoader,父類是ExtClassLoader,"java.class.path"中的類均可以被這個類加載器加載;

    四、URLClassLoader,通常這個類幫咱們實現了大部分的工做,自定義能夠繼承這個類,這樣僅僅在須要的地方作修改就好了;

 

JVM加載class文件到內存的方式

    一、顯示加載:不經過代碼裏的ClassLoader調用,而是JVM來自動加載類到內存中的方式;

            1.一、經過Class中的forName;

            1.二、經過ClassLoader中的loadClass

            1.三、經過ClasLoader中的findSystemClass

    二、隱身加載:經過代碼中ClassLoader來加載的方式;

 

如何加載class文件

    一、找到.class文件,並把文件中包含的byte加載到內存中

    二、驗證和解析

          2.一、字節碼驗證,確保格式正確和行爲正確

          2.二、類準備,類中定義的字段、方法和實現接口鎖必須的數據結構

          2.三、解析,裝入類所引用的其餘全部類,如父類、字段、方法簽名、方法中使用的本地變量等

    三、靜態屬性和初始化賦值,以及靜態塊的執行等

 

關於類加載過程當中的幾種常見異常

一、ClassNotFoundException

    JVM要加載指定的文件的字節碼到內存中,可是並無發現這個文件的字節碼。檢查方法就是在classpath中看看是否有指定文件存在。

二、NoClassDefFoundError

    JVM規範中這個異常出現的狀況是使用new 關鍵字、屬性引用類、實現接口、繼承類,若是不存在,會報這個異常。

三、ClassCastException

    對於普通對象,對象必須是目標類的實例或者目標類的子類的實例,若是目標類是接口,那麼會把他當作實現了該接口的一個子類。

 

有哪些須要自定義ClassLoader的狀況?

一、在自定義的路徑下查找自定義的classs文件,須要的文件並非classpath下面的;

二、對於加載的類作特殊的處理,例如網絡傳輸的安全性等;

三、能夠定義類的失效機制,例如檢查到文件被修改,則從新加載,從而實現類的熱部署;

 

http://iamzhongyong.iteye.com/blog/2091549

相關文章
相關標籤/搜索