摘要:類加載流程類加載流程,先加載啟動類加載即最頂層的加載類。繼續(xù)再次加載擴(kuò)展類加載器由加載,加載進(jìn)入內(nèi)存。即,如果需要將當(dāng)前類加載進(jìn)入,那么就需要重寫方法,若未找到這幾種類,則會自動調(diào)用方法。調(diào)用該方法調(diào)用類中的,參數(shù)為空的方法。
類加載流程
類加載流程,先加載Bootstrap ClassLoader 啟動類加載即最頂層的加載類。這部分由C++ 編寫。
繼續(xù)再次加載Extention ClassLoader 擴(kuò)展類加載器由Bootstrap ClassLoader加載,加載進(jìn)入內(nèi)存。
繼續(xù)再次加載Application ClassLoader 應(yīng)用類加載器,即系統(tǒng)即在此,加載當(dāng)前應(yīng)用下的類
最后再次加載ClassLoader類
該模型是先檢查指定名稱的類是否已經(jīng)加載過,如果加載進(jìn)入內(nèi)存,不加載直接返回,如果沒有加載過,判斷是否有父類加載器,如果擁有父類加載器,那么將會直接將權(quán)利移交給父類,由父類代理當(dāng)前類進(jìn)行加載該類?;蛘呤钦{(diào)用C++的bootstrap類加載器來加載該類
最后如果三者都沒有找到類,那么直接調(diào)用當(dāng)前類加載器的findClass方法來完成類加載。
即,如果需要需要加載自定義的類,那么就需要重寫findClass方法。
即,如果需要將當(dāng)前類加載進(jìn)入,那么就需要重寫findClass方法,若未找到這幾種類,則會自動調(diào)用findClass方法。調(diào)用過程
先加載父類,若父類未加載,繼續(xù)調(diào)用父類,直到bootstrap查看是否已經(jīng)加載,如果此時都未加載類,那么將會使用自定義的ClassLoader 然后調(diào)用自定義的ClassLoader的findClass方法,用于將字節(jié)碼加載進(jìn)入內(nèi)存。最后返回該class的描述符
栗子public class Test { public void helloWorld(){ System.out.println("me loader" + getClass().getClassLoader().getClass()); // 先調(diào)用getClass獲取當(dāng)前類的對象的描述,然后再次調(diào)用getClassLoader()獲取加載的父類,再次調(diào)用getClass()獲取加載進(jìn)入的父類的名稱 } }
此時如果該類這這個項目里的里的話,會由Application加載當(dāng)前應(yīng)用類下的類。
由類的加載過程可知,當(dāng)未找到類的時候,會加載類的ClassLoader類,此時需要定義一個類,讓該類繼承ClassLoader類,由于該類是ClassLoader的子類,此時會自動加載該類,由于該類不在內(nèi)存當(dāng)中,所以需要使用static,讓其一開始加載進(jìn)入內(nèi)存當(dāng)中。
代碼如下
import java.io.FileInputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { // 需要使用static讓其加載進(jìn)入內(nèi)存 static class myClassLoader extends ClassLoader{ private String classPath; // 獲取當(dāng)前類的在磁盤中保存的地址 // 通過構(gòu)造函數(shù)將地址注入 public myClassLoader(String classPath){ this.classPath = classPath; } // 將文件內(nèi)容加載進(jìn)入內(nèi)存 private byte[] loadByte(String name) throws Exception{ // 獲取一個輸入流, FileInputStream fis = new FileInputStream(classPath + "/" + name + ".class"); // 獲取長度 int len = fis.available(); // 定義byte數(shù)組 byte[] data = new byte[len]; // 加載進(jìn)入內(nèi)存 fis.read(data); // 關(guān)閉流 fis.close(); return data; } // 重寫findClass方法,讓加載的時候調(diào)用findClass方法 protected Class> findClass(String name) throws ClassNotFoundException{ try{ // 讀取文件到數(shù)組中 byte[] data = loadByte(name); // 將字節(jié)碼加載進(jìn)入內(nèi)存當(dāng)中 return defineClass(name, data, 0, data.length); }catch(Exception e){ e.printStackTrace(); } return null; } } public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException { // 先初始化該類 myClassLoader classLoader = new myClassLoader("/home/ming"); // 此時會調(diào)用findClass加載Test.class加載進(jìn)入內(nèi)存當(dāng)中 Class clazz = classLoader.loadClass("Test"); // 實例化該類對象 Object obj = clazz.newInstance(); // 獲取clazz該類方法中名稱為hello,參數(shù)為空的方法。 Method helloMethod = clazz.getDeclaredMethod("helloWorld", null); // 調(diào)用該方法 // 調(diào)用obj類中的helloMethod,參數(shù)為空的方法。 helloMethod.invoke(obj, null); } }
實驗結(jié)果
me loaderclass Main$myClassLoader Process finished with exit code 0
https://www.iming.info/shuang...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73125.html
摘要:類加載過程雙親委派模型聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處類加載過程類加載機(jī)制將類描述數(shù)據(jù)從文件中加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行,解析和初始化,最終形成被直接使用的類型。深入理解虛擬機(jī)高級特性與最佳實踐加載加載階段由類加載器負(fù)責(zé),過程見類加載 JVM類加載過程 & 雙親委派模型 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處https://segmentfault.com/u/yzwall ...
摘要:比如我們要加載類,無論我們用哪個類加載器去加載類,這個加載請求最終都會委托給,這樣就保證了所有加載器加載的類都是同一個類。如果沒有雙親委派模型,那就亂了套了,完全可能搞出多個不同的類。 前言 雙親委派模型是Java加載類的機(jī)制.采用雙親委派模型的好處是Java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層級關(guān)系,通過這種層級關(guān)系可以避免類的重復(fù)加載. 1. 模型基礎(chǔ) showImg(h...
摘要:如果需要支持類的動態(tài)加載或需要對編譯后的字節(jié)碼文件進(jìn)行解密操作等,就需要與類加載器打交道了。雙親委派模型,雙親委派模型,約定類加載器的加載機(jī)制。任何之類的字節(jié)碼都無法調(diào)用方法,因為該方法只能在類加載的過程中由調(diào)用。 jvm系列 垃圾回收基礎(chǔ) JVM的編譯策略 GC的三大基礎(chǔ)算法 GC的三大高級算法 GC策略的評價指標(biāo) JVM信息查看 GC通用日志解讀 jvm的card table數(shù)據(jù)...
摘要:宗主引導(dǎo)類加載器。雙親委派模型是如何使用的我們在自定義加載器中查找是否有需要加載的文件,如果已經(jīng)加載過,直接返回字節(jié)碼。 作者:畢來生微信:878799579 1、小故事理解類加載器以及雙親委派模型 首先我們來描述一個小說場景,通過這個場景在去理解我們相關(guān)的類加載器的執(zhí)行以及雙親委派模型。 上古時代有逍遙派和萬魔宗兩個宗派,互相對立。逍遙派比萬魔門更加強(qiáng)勢。巔峰戰(zhàn)力更高。 有一天萬魔宗...
摘要:虛擬機(jī)為了保證一個類的方法在多線程環(huán)境中被正確地加鎖同步。但啟動類加載器不可能認(rèn)識這些代碼。實現(xiàn)模塊化熱部署的關(guān)鍵則是它的自定義類加載器機(jī)制的實現(xiàn)。 概念區(qū)分:加載、類加載、類加載器 類加載是一個過程。 加載(Loading)是類加載這一個過程的階段。 類加載器是ClassLoader類或其子類。 本文中的類的描述都包括了類和接口的可能性,因為每個Class文件都有可能代表J...
摘要:雙親委派模型中方法雙親委派是指如果一個類收到了類加載的請求,不會自己先嘗試加載,先找父類加載器去完成。當(dāng)頂層啟動類加載器表示無法加載這個類的時候,子類才會嘗試自己去加載。 類加載過程:加載、驗證(驗證階段作用是保證Class文件的字節(jié)流包含的信息符合JVM規(guī)范,不會給JVM造成危害)、準(zhǔn)備(準(zhǔn)備階段為變量分配內(nèi)存并設(shè)置類變量的初始化)、解析(解析過程是將常量池內(nèi)的符號引用替換成直接引用...
閱讀 5067·2021-09-07 09:58
閱讀 791·2019-08-30 15:55
閱讀 2930·2019-08-30 15:55
閱讀 926·2019-08-30 15:53
閱讀 1559·2019-08-29 12:57
閱讀 1823·2019-08-26 13:46
閱讀 568·2019-08-26 11:00
閱讀 3668·2019-08-23 15:42