什么是類加載器和雙親委派機制

本篇內容介紹了“什么是類加載器和雙親委派機制”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

創新互聯公司專注于滿洲網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供滿洲營銷型網站建設,滿洲網站制作、滿洲網頁設計、滿洲網站官網定制、重慶小程序開發服務,打造滿洲網絡公司原創品牌,更為您提供滿洲網站排名全網營銷落地服務。

(一)概述

我們都知道Java代碼會被編譯成class文件,在class文件中描述了該類的各種信息,class類最終需要被加載到虛擬機中才能運行和使用。

虛擬機把Class文件加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成虛擬機可以直接使用的Java類型,這就是虛擬機的類加載機制。

(二)類加載的過程

一個類從被加載到卸載出內存,一共包含下面七個階段:

加載、驗證、準備、解析、初始化、使用、卸載 什么是類加載器和雙親委派機制 加載的來源有以下部分:

1、本地磁盤

2、網絡下載的.class文件

3、war,jar下加載.class文件

4、從專門的數據庫中讀取.class文件(少見)

5、將java源文件動態編譯成class文件,典型的就是動態代理,通過運行時生成class文件

加載的過程是通過類加載器實現的。有關類加載的其他過程我會在下一章中介紹。

(三)類加載器的分類

類加載器分為系統級別和用戶級別:

系統級別的類加載器有:

1、啟動類加載器(底層使用C++實現)

2、擴展類加載器(底層使用java實現,是ClassLoader的子類)

3、應用程序類加載器(底層使用java實現,是ClassLoader的子類)

用戶級別的類加載器我們統一稱為自定義類加載器。

3.1 啟動類加載器

首先我們來看看啟動類加載器加載了哪些類,啟動類加載器負責加載sun.boot.class.path:

public static void bootClassLoaderLoadingPath(){
    //獲取啟動列加載器加載的目錄
    String bootStrapLoadingPath=System.getProperty("sun.boot.class.path");
    //把加載的目錄轉為集合
    List<String> bootLoadingPathList= Arrays.asList(bootStrapLoadingPath.split(";"));
    for (String bootPath:bootLoadingPathList){
        System.out.println("啟動類加載器加載的目錄:"+bootPath);
    }
}

通過上面的代碼我們可以獲取到啟動類加載器所加載的類:

什么是類加載器和雙親委派機制

3.2 拓展類加載器

擴展類加載器加載負責加載java.ext.dirs,我們同樣寫一段代碼去加載它:

public static void extClassLoaderLoadingPath(){
    //獲取啟動列加載器加載的目錄
    String bootStrapLoadingPath=System.getProperty("java.ext.dirs");
    //把加載的目錄轉為集合
    List<String> bootLoadingPathList= Arrays.asList(bootStrapLoadingPath.split(";"));
    for (String bootPath:bootLoadingPathList){
        System.out.println("拓展類加載器加載的目錄:"+bootPath);
    }
}

可以看到,除了加載了JDK目錄下的ext外,還加載了Sun目錄下的ext

什么是類加載器和雙親委派機制

3.3 應用程序類加載器

最后是應用類加載器,它負責加載java.class.path:

public static void appClassLoaderLoadingPath(){
    //獲取啟動列加載器加載的目錄
    String bootStrapLoadingPath=System.getProperty("java.class.path");
    //把加載的目錄轉為集合
    List<String> bootLoadingPathList= Arrays.asList(bootStrapLoadingPath.split(";"));
    for (String bootPath:bootLoadingPathList){
        System.out.println("應用程序類加載器加載的目錄:"+bootPath);
    }
}

它負責加載工程目錄下classpath下的class以及jar包。

(四)雙親委派模型

所謂雙親委派模型,就是指一個類接收到類加載請求后,會把這個請求依次傳遞給父類加載器(如果還有的話),如果頂層的父類加載器可以加載,就成功返回,如果無法加載,再依次給子加載器去加載。 什么是類加載器和雙親委派機制 我們先通過代碼來看一下類加載器的層級結構:

public class ClassLoaderPath {
    public static void main(String[] args) {
        System.out.println(ClassLoaderPath.class.getClassLoader());
        System.out.println(ClassLoaderPath.class.getClassLoader().getParent());
        System.out.println(ClassLoaderPath.class.getClassLoader().getParent().getParent());
    }
}

編寫一個類,依次輸出這個類的類加載器,父類加載器,父類的父類加載器

什么是類加載器和雙親委派機制

可以看到首先是應用程序類加載器,它的父類是擴展類加載器,擴展類加載器的父類輸出了一個null,這個null會去調用啟動類加載器。如果你不信,我們看源碼:ClassLoader類

什么是類加載器和雙親委派機制

接著從父類加載器往下調用findClass,如果可以加載,就直接返回class,如果不能加載,就依次向下。如果到了自定義加載器還是無法被加載,就會拋出ClassNotFound異常。

我畫了一個流程圖來展示雙親委派模型的全過程:

什么是類加載器和雙親委派機制

雙親委派模型保證了Java程序的穩定運行,可以避免類的重復加載,也保證了 Java 的核心 API 不被篡改。

(五)破壞雙親委派

雙親委派模型并不是絕對的,spi機制就可以打破雙親委派模型。

首先我們需要了解什么是spi,spi(Service Provider Interface)是一種服務發現機制,Java在核心庫中定義了許多接口,并且針對這些接口給出調用邏輯,但是并未給出具體的實現。開發者要做的就是定制一個實現類,在 META-INF/services 中注冊實現類信息,以供核心類庫使用。最典型的就是JDBC。

Java提供了一個Driver接口用于驅動各個廠商的數據庫連接,Driver類位于JAVA_HOME中jre/lib/rt.jar中,應該由Bootstrap類加載器進行加載。根據類加載機制,當被加載的類引用了另外一個類的時候,虛擬機就會使用加載該類的類加載器加載被引用的類,因此如果其他數據庫廠商定制了Driver的實現類之后,按理說也得把這個實現類放到啟動類加載器加載的目錄下,這顯然是很不合理的。

于是Java提供了spi機制,即使Driver由啟動類加載器去加載,但是他可以讓線程上下文加載器(Thread Context ClassLoader)去請求子類加載器去完成加載,默認是應用程序類加載器。但是這確實破壞了類加載機制。

“什么是類加載器和雙親委派機制”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!

本文名稱:什么是類加載器和雙親委派機制
文章鏈接:http://www.kartarina.com/article26/gogccg.html

成都網站建設公司_創新互聯,為您提供網站制作、外貿網站建設、搜索引擎優化、移動網站建設網站改版關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站建設網站維護公司
主站蜘蛛池模板: 亚洲另类无码专区丝袜| 国产AV无码专区亚洲AV蜜芽| 东京热av人妻无码| 熟妇人妻无码中文字幕老熟妇| 无码人妻少妇伦在线电影| 色爱无码AV综合区| 自慰无码一区二区三区| 亚洲性无码AV中文字幕| 无码性午夜视频在线观看| 亚洲成av人片不卡无码久久| 亚洲AV无码乱码麻豆精品国产| 国产成人无码一区二区三区在线| 亚洲国产成人无码AV在线| 午夜亚洲AV日韩AV无码大全 | 免费人妻av无码专区| 精品无码无人网站免费视频 | 亚洲av无码一区二区三区天堂| 国产品无码一区二区三区在线蜜桃| 无码无套少妇毛多18PXXXX| 久久精品亚洲中文字幕无码麻豆 | 亚洲中文字幕久久精品无码A| 特级做A爰片毛片免费看无码| 日韩免费无码一区二区视频| 无码人妻一区二区三区兔费| 久久久久亚洲av无码尤物| 亚洲AV无码专区在线播放中文| 丰满少妇人妻无码| 波多野结AV衣东京热无码专区| 日韩加勒比一本无码精品| 少妇无码?V无码专区在线观看| 免费无码A片一区二三区 | 无码专区永久免费AV网站| 久久无码国产专区精品| 久久亚洲AV无码精品色午夜麻豆| 国产精品无码久久综合| 久久久国产精品无码免费专区| 亚洲AV无码欧洲AV无码网站| 少妇精品无码一区二区三区| 久久精品中文无码资源站| 一本色道无码道DVD在线观看| 丰满少妇人妻无码专区|