虚拟机类加载机制---类加载器
類加載器
??類加載階段中“通過一個類的全限定名來獲取描述此類的二進制字節(jié)流”這個動作放到java虛擬機外部去實現。實現這個動作的代碼模塊稱為“類加載器”。
類與類加載器
??兩個類相等,需要類本身相等,并且使用同一個類加載器進行加載,這是因為每一個類加載器都有一個獨立的類名稱空間。
??這里的相等,包括類的 Class 對象的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回結果為 true,也包括使用 instanceof 關鍵字做對象所屬關系判定結果為 true。
類加載器分類
從Java虛擬機的角度來講,只存在以下兩種不同的類加載器:
- 啟動類加載器(Bootstrap ClasssLoader)使用c++實現,是虛擬機的一部分。
- 所有其他類加載器,使用Java實現,獨立于虛擬機,繼承自抽象類java.lang.ClassLoader。
從Java開發(fā)人員的角度來看,類加載器可以劃分的更細致:
- 啟動類加載器:此類加載器將存放在\lib目錄中,或者被 -Xbootclasspath 參數所指定的路徑中的,并且是虛擬機識別的(僅按照文件名識別,如 rt.jar,名字不符合的類庫即使放在
lib 目錄中也不會被加載)類庫加載到虛擬機內存中。啟動類加載器無法被 Java 程序直接引用,用戶在編寫自定義類加載器時,如果需要把加載請求委派給啟動類加載器,直接使用 null 代替即可。 - 擴展類加載器(Extension ClassLoader):這個類加載器是由ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現的,它負責將/lib/ext或者java.ext.dir系統(tǒng)變量所指定的路徑中的所有類庫加載到內存中,開發(fā)者可以直接使用擴展類加載器。
- 應用程序類加載器:(Application ClassLoader)這個類加載器是由 AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的。由于這個類加載器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也稱它為系統(tǒng)類加載器。它負責加載用戶路徑上所指定的類庫,開發(fā)者可以直接使用這個類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。
雙親委派模型
圖中展示類加載器之間的這種層次關系,稱為類加載器的雙親委托模型。
??雙親委托模型除了頂層的啟動類加載器外,其余的類加載器都有自己的父類加載器。這里類加載器之間的父子關系一般不會以繼承的關系來實現,而是使用組合關系來復用父加載器的代碼。
??雙親委托模型的工作過程:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,因此所有的類加載請求最終都應該傳到頂層的啟動類加載器中,只有當父類加載器反饋自己無法完成這個加載請求時,子類加載器才會自己去加載。
??雙親委托模型的好處:java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層次關系。從而使基礎類得到統(tǒng)一。
??雙親委托模型的實現:實現雙親委托模型的代碼都集中在java.lang.ClassLoader的loadClass()方法之中。
??如下面代碼所示:先檢查是否已經被加載過,若沒有被加載則調用父類加載器的loadClass()方法,若父類加載器為空則默認使用啟動類加載器作為父加載器,如果父類加載失敗,拋出ClassNotFoundException異常后,再調用自己的findClass()方法進行加載。
protected synchronized Class<?>loadClass(String name,boolean resolve)throws ClassNotFoundException{//首先檢查請求的類是否已被加載過Class c=findLoadedClass(name);if(c==null){try{if(parent!=null){c=parent.loadClass(name,false);}else{c=findBootstrapClassOrNull(name);}}catch(ClassNotFoundException e){//如果父類加載器拋出ClassNotFoundException//說明父類加載器無法完成加載請求}if(c==null)c=findClass(name);}if(resolve)resolveClass(c);return c; }轉載于:https://www.cnblogs.com/yjxyy/p/11128769.html
總結
以上是生活随笔為你收集整理的虚拟机类加载机制---类加载器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白鹭 修改底层 egret.js 库后再
- 下一篇: django后台接收form-data