亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java類加載器的組織結構是什么

發布時間:2022-01-06 22:32:23 來源:億速云 閱讀:166 作者:iii 欄目:編程語言

本篇內容主要講解“Java類加載器的組織結構是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java類加載器的組織結構是什么”吧!

首先回顧一下,java虛擬機載入java類的步驟:java文件經過編譯器編譯后變成字節碼文件(.class文件),類加載器 (ClassLoader)讀取.class文件,并且轉換成java.lang.Class的一個實例,***通過newInstance方法創建該類的 一個對象。ClassLoader的作用就是根據一個類名,找到對應的字節碼,根據這些字節碼定義出對應的類,該類就是java.lang.Class的 一個實例。

類加載器的組織結構

java有三個初始類加載器,當java虛擬機啟動時,它們會按照以下順序啟動:Bootstrap  classloader -> extension classloader -> system  classloader。三者的關系:bootstrap classloader是extension  classloader的parent,extension classloader是system classloader的parent。

bootstrap classloader

它是最原始的類加載器,并不是由java代碼寫的,是由原生代碼編寫的。Java有一次編譯、所有平臺運行的效果,就是因為它寫了一份功能相同,但針對不同平臺不同語言實現的底層代碼。它負責加載java核心庫,大家可運行以下代碼,看看自己本地的java核心庫在哪里:

URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); }

本人的運行結果:

file:/home/eric/jdk1.6.0_35/jre/lib/resources.jar file:/home/eric/jdk1.6.0_35/jre/lib/rt.jar file:/home/eric/jdk1.6.0_35/jre/lib/sunrsasign.jar file:/home/eric/jdk1.6.0_35/jre/lib/jsse.jar file:/home/eric/jdk1.6.0_35/jre/lib/jce.jar file:/home/eric/jdk1.6.0_35/jre/lib/charsets.jar file:/home/eric/jdk1.6.0_35/jre/lib/modules/jdk.boot.jar file:/home/eric/jdk1.6.0_35/jre/classes

extension classloader

它用來加載JRE的擴展目錄(JAVA_HOME/jre/lib/ext或java.ext.dirs系統屬性指定的)JAR的類包。注意,因為它是bootstrap classloader加載的,所以當你運行:

ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());

輸出的是:the parent of extension classloader : null

system classloader

它用于加載classpath目錄下的jar包,我們寫的java類,一般都是由它加載,除非你自己制定個人的類加載器。

全盤負責委托機制

classloader加載類時,使用全盤負責委托機制,可以分開兩部分理解:全盤負責,委托。

全盤負責機制:若類A調用了類B,則類B和類B所引入的所有jar包,都由類A的類加載器統一加載。

委托機制:類加載器在加載類A時,會優先讓父加載器加載,當父加載器加載不到,再找父父加載器,一直找到bootstrap  classloader都找不到,才自己去相關的路徑去尋找加載。以下是ClassLoader的源碼:

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException     { // First, check if the class has already been loaded Class c = findLoadedClass(name); if (c == null) {     try {   if (parent != null) {       //從父加載器加載       c = parent.loadClass(name, false);   } else {       //從bootstrap loader加載       c = findBootstrapClassOrNull(name);   }     } catch (ClassNotFoundException e) {                 // ClassNotFoundException thrown if class not found                 // from the non-null parent class loader             }             if (c == null) {         // If still not found, then invoke findClass in order         // to find the class.         c = findClass(name);     } } if (resolve) {     resolveClass(c); } return c;     }

舉個例子,類加載器加載類A的過程:

1,判斷是否已經加載過,在cache里面查找,若有,跳7;否則下一步

2,判斷當前加載器是否有父加載器,若無,則當前為ext classloader,跳去4;否則下一步

3,請求父加載器加載該類,若加載成功,跳7;若不成功,即父加載器不能找到該類,跳2

4,請求jvm的bootstrap classloader加載,若加載成功,跳7;若失敗,跳5

5,當前加載器自己加載,若成功,跳7;否則,跳6

6,拋出ClassNotFoundException

7,返回Class

編寫自己的類加載器

Java加載類的過程,實質上是調用loadClass()方法,loadClass中調用findLoadedClass()方法來檢查該類是否 已經被加載過,如果沒有就會調用父加載器的loadClass(),如果父加載器無法加載該類,就調用findClass()來查找該類。

所以我們要做的就是新建MyClassLoader繼承java.lang.ClassLoader,重寫其中的findClass()方法。主要是重新設計查找字節碼文件的方案,然后調用definedClass來返回。

到此,相信大家對“Java類加載器的組織結構是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宕昌县| 鱼台县| 依安县| 富裕县| 河池市| 顺平县| 友谊县| 三明市| 新田县| 从江县| 永仁县| 砚山县| 嘉定区| 鄂伦春自治旗| 黑龙江省| 文化| 宜州市| 绥芬河市| 绥阳县| 新乐市| 灌云县| 东源县| 定州市| 西平县| 阜康市| 景东| 兴隆县| 鄂伦春自治旗| 隆昌县| 全州县| 禄丰县| 樟树市| 长泰县| 丹东市| 克拉玛依市| 鞍山市| 北辰区| 称多县| 宜兰县| 淳化县| 恩施市|