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