精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JVM 類加載器有哪些?雙親委派機制的作用是什么?如何自定義類加載器?

開發 前端
引導類加載器 BootstrapClassLoader:引導類加載器是使用 C++ 語言實現的,嵌入在 JVM 中。用于加載 Java 中的核心類庫的,不繼承自 java.lang.ClassLoader,在 Java 程序中通常返回 null。

類加載器分類

先回顧下,在 Java 中,類的初始化分為幾個階段: 加載、鏈接(包括驗證、準備和解析)和 初始化。

而 類加載器(Class Loader)則是加載階段中,負責將本地或網絡中的指定類的二進制流,加載到 Java 虛擬機中的工具。

圖片圖片

引導類加載器 BootstrapClassLoader

引導類加載器 BootstrapClassLoader:引導類加載器是使用 C++ 語言實現的,嵌入在 JVM 中。用于加載 Java 中的核心類庫的,不繼承自 java.lang.ClassLoader,在 Java 程序中通常返回 null。

一般會加載 JAVA_HOME 目錄下的 /jre/lib 文件夾下的 jar 和配置。

ClassLoader loader = String.class.getClassLoader();
System.out.println(loader); // 輸出 null,因為 String 是由引導類加載器加載的

擴展類加載器 ExtClassLoader

擴展類加載器主要負責加載 Java 的擴展類庫,一般會加載 JAVA_HOME 目錄下的 /jre/lib/ext 文件夾下的 jar。

繼承自 java.lang.ClassLoader,是用戶可以訪問的第一個類加載器。

ClassLoader extLoader = ClassLoader.getSystemClassLoader().getParent();
System.out.println(extLoader); // 輸出 sun.misc.Launcher$ExtClassLoader

應用類加載器(Application ClassLoader)

應用類加載器是應用程序中默認的類加載器,可以加載 CLASSPATH 變量指定目錄下的 jar,由 sun.misc.Launcher$AppClassLoader 實現。

并且一般情況下,我們編寫的 Java 應用的類,都是使用該類加載器完成加載的。

ClassLoader appLoader = ClassLoader.getSystemClassLoader();
System.out.println(appLoader); // 輸出 sun.misc.Launcher$AppClassLoader

類加載器抽象類 ClassLoader

在 Java 中存在一個類加載器抽象類 ClassLoader,大多數類加載器都是通過繼承這個類來實現的類加載功能。以下是 ClassLoader 類的關鍵部分代碼:

public abstract class ClassLoader {

    /*
     * 類加載器的父加載器
     */
    private final ClassLoader parent;

    /**
     * 根據類的全限定名加載類
     *
     * @param name 類名稱
     * @return     加載的Class對象
     * @throws ClassNotFoundException 沒有發現指定類異常
     */
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        // 調用loadClass方法加載類,其中設置resolve=false,表示不立即解析類
        return loadClass(name, false);
    }

    /**
     * 根據類的全限定名加載類
     *
     * @param name    類名稱
     * @param resolve 是否解析這個類,true=解析,false=不解析
     * @return 加載的Class對象
     * @throws ClassNotFoundException 沒有發現指定類異常
     */
    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            // 檢查類是否已經被加載
            Class<?> c = findLoadedClass(name);
            // 如果沒有加載過
            if (c == null) {
                // 如果有父類加載器,則委托給父加載器去加載
                // 如果沒有父類加載器,則判斷 Bootstrap 類加載器是否加載過
                if (parent != null) {
                    c = parent.loadClass(name, false);
                } else {
                    c = findBootstrapClassOrNull(name);
                }
                // 如果父類加載器都加載失敗,則當前類加載器嘗試自行加載
                if (c == null) {
                    c = findClass(name);
                }
            }
            // 據 resolve 參數決定是否解析類
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

    /**
     * 查找并加載指定名稱的類
     *
     * @param name 類名稱
     * @return Class對象
     * @throws ClassNotFoundException 沒有發現指定類異常
     */
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        //1. 根據傳入的類名,到在特定目錄下去尋找類文件,把字節碼文件讀入內存
        // ...
        //2. 調用 defineClass 將字節數組轉成 Class 對象
        return defineClass(buf, off, len);
    }

    /**
     * 將一個 byte[] 轉換為 Class 類的實例
     *
     * @param name 類名稱,如果不知道此名稱,則該參數為 null
     * @param b    組成類數據的字節數組
     * @param off  類數據的起始偏移量
     * @param len  類數據的長度
     * @return Class對象
     * @throws ClassFormatError 類格式化異常
     */
    protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError {
        ...
    }

}

類中定義的常用的類加載相關的方法:

方法名稱

描述

getParent()

返回該類加載器的父類加載器

loadClass(String name)

加載指定名稱的類,返回 java.lang.Class 實例

findClass(String name)

查找指定名稱的類,返回 java.lang.Class 實例

findLoadedClass(String name)

查找已加載的指定名稱的類,返回 java.lang.Class 實例

defineClass(String name, byte[] b, int off, int len)

將字節數組轉換為一個 Java 類,返回 java.lang.Class 實例

resolveClass(Class c)

連接指定的 Java 類

雙親委派模型(Parent Delegation Model)

雙親委派模型 是類加載器的設計模式,其核心思想是:類加載請求由子類加載器向父類加載器逐層委派,直到引導類加載器。

如果父類加載器無法加載,子類加載器才會嘗試加載。

如果子類加載器也無法加載該類,就會拋出一個 ClassNotFoundException 異常。

圖片圖片

雙親委派機制的作用

我們試想一下,如果不使用這種委托模式,那我們就可以隨時使用自定義的 String 類來動態替代 Java 核心 API 中定義的類型,這樣會存在非常大的安全隱患。

而雙親委托的方式,就可以避免這種情況,因為 String 已經在啟動時就被引導類加載器 (BootstrcpClassLoader) 加載,所以用戶自定義的 ClassLoader 永遠也無法加載一個用戶自己自定義的 String 類,除非你改變 JDK 中 ClassLoader 搜索類的默認算法。

該機制的作用如下。

  • 防止重復加載字節碼文件: 將類加載請求先委托給父類,父類加載后子類就不會重復加載該類。所以,雙親委派機制可以防止對某個類重復加載;
  • 防止核心字節碼文件被篡改: 一般情況下引導類加載器會先加載 JVM 核心類庫,然后其它加載器才會執行,如果其它加載器要加載一個被篡改的核心字節碼文件,會將該文件委托給父類加載器,當委托到引導類加載器時,加載器已經加載過該類,就不會對該類進行重復加載。而且就算能被加載,那么加載它的肯定不是相同的類加載器 (不會是引導類加載器),Java 虛擬機中只認可核心類加載器加載的核心類庫,所以,雙親委派機制可以防止核心字節碼文件被篡改。
  • 簡化加載邏輯: 通過委派模式,每個類加載器只需要關注自己負責的那部分類加載邏輯,而不必關心其他類加載器的加載細節,簡化了類加載器的實現,降低了系統的復雜度。

自定義類加載器

在某些場景下,標準的類加載器無法滿足需求,例如:

  1. 熱部署:在 Web 服務器中動態加載或更新類。
  2. 模塊隔離:在同一個 JVM 中加載不同版本的類。
  3. 加密解密:加載經過加密的 Class 文件。

默認的類加載器只能加載指定目錄下的 Jar 和 Class 文件。

如果需要加載指定位置的類文件并實現一些自定義邏輯,就需要自定義類加載器。

Chaya:如何實現自定義類加載器?

步驟:

  • 繼承 java.lang.ClassLoader 類。
  • 重寫 findClass() 方法,通過字節流讀取 Class 文件并轉換為 Class 對象。
import java.io.*;

public class MyClassLoader extends ClassLoader {
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] classData = loadClassData(name);
        if (classData == null) {
            throw new ClassNotFoundException();
        }
        return defineClass(name, classData, 0, classData.length);
    }

    private byte[] loadClassData(String name) {
        String fileName = name.replace('.', '/') + ".class";
        try (InputStream is = new FileInputStream(fileName);
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            int buffer;
            while ((buffer = is.read()) != -1) {
                baos.write(buffer);
            }
            return baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

示例說明

  • findClass():從文件系統加載 Class 文件,并將其定義為 Class 對象。
  • defineClass():將字節數組轉換為 JVM 可執行的 Class 對象。

為了為保證類加載器都正確實現雙親委派機制,在開發自己的類加載器時,只需要重寫 findClass() 方法即可。

當然,如果不想使用雙親委派機制時,就需要重寫 loadClass() 方法。

打破雙親委派模型

有時為了實現特殊功能,我們需要打破雙親委派模型,例如:

  • 熱部署框架:Tomcat、Spring Boot 使用自定義類加載器加載和卸載 Web 應用。
  • SPI(Service Provider Interface)機制:JDBC 驅動等需要通過 線程上下文類加載器 來加載用戶實現的接口。
責任編輯:武曉燕 來源: 碼哥跳動
相關推薦

2025-07-01 07:41:37

Java類加載器雙親委派

2024-04-09 08:41:41

JVM類加載Java

2023-12-06 12:11:43

類加載器雙親委派模型

2024-03-12 07:44:53

JVM雙親委托機制類加載器

2024-03-27 09:15:27

2020-11-06 00:50:16

JavaClassLoaderJVM

2021-07-05 06:51:43

Java機制類加載器

2023-10-19 09:14:34

Java開發

2023-10-31 16:00:51

類加載機制Java

2022-08-08 08:17:43

類隔離加載器自定義類

2020-10-26 11:20:04

jvm類加載Java

2024-12-02 09:01:23

Java虛擬機內存

2012-02-09 10:31:17

Java

2021-01-06 09:51:19

類加載器雙親委派模型

2017-09-20 08:07:32

java加載機制

2017-03-08 10:30:43

JVMJava加載機制

2021-04-29 11:18:14

JVM加載機制

2023-10-30 01:02:56

Java類類加載器雙親委派

2022-06-15 11:01:59

自定義SPIJava

2023-08-02 08:38:27

JVM加載機制
點贊
收藏

51CTO技術棧公眾號

国产欧美韩国高清| 欧美mv日韩mv国产| 亚洲最大色综合成人av| 国产chinasex对白videos麻豆| 激情久久久久久久| 亚洲香蕉av在线一区二区三区| 亚洲 国产 图片| 国产欧洲在线| 亚洲色图都市小说| 久久久久久国产精品一区| 99精品在线直播| 国产综合精品在线| 9l亚洲国产成人精品一区二三| 色94色欧美sute亚洲线路一ni| 亚洲成年人专区| 巨骚激情综合| 成人教育av在线| 成人性教育视频在线观看| 可以免费看的av毛片| 99久久99久久精品国产片果冰| 亚洲成色777777女色窝| av在线网址导航| 中文在线资源| 亚洲一级在线观看| 一区二区av| 飘雪影视在线观看免费观看| 高清不卡一区二区| 91麻豆桃色免费看| a片在线免费观看| 亚洲精品专区| 久久久久久91香蕉国产| 国产一区二区三区视频播放| 国产精品美女久久久久久不卡| 欧美成人乱码一区二区三区| 亚洲小视频网站| 高清av一区二区三区| 日韩欧美国产高清91| 被灌满精子的波多野结衣| 超鹏97在线| 国产精品久久久久久久久免费樱桃| 欧美精品亚洲| 天堂影院在线| 91在线看国产| 久久综合九色欧美狠狠| 国产 欧美 自拍| 国产成人在线观看免费网站| 91久久久久久久一区二区| 91亚洲国产成人精品一区| 美女网站一区二区| 国产精品视频26uuu| 中文字幕av免费观看| 日产国产欧美视频一区精品| 国产91色在线|免| 中文人妻av久久人妻18| 久久午夜电影| 美女看a上一区| 久久亚洲私人国产精品va| 国产农村妇女精品一区| 青青草原综合久久大伊人精品 | 99香蕉久久| 日韩欧美的一区二区| 欧美在线a视频| 国产美女亚洲精品7777| 欧美一级高清大全免费观看| 手机在线播放av| 成人看片黄a免费看视频| 精品福利在线导航| 五月婷婷综合在线观看| 欧美在线色图| 久久成人在线视频| 日本天堂在线视频| 丝袜国产日韩另类美女| 国产精品视频永久免费播放| 一级α片免费看刺激高潮视频| 韩国一区二区三区| 国产伦精品一区二区三区视频孕妇| 中文字幕五月天| 无遮挡在线观看| 91国偷自产一区二区开放时间 | 蜜桃av一区二区在线观看| 日韩免费观看网站| 国产精品老熟女视频一区二区| 国产高清无密码一区二区三区| 国产精品v欧美精品∨日韩| 日韩欧美在线观看一区二区| 中文在线一区二区| 大胆欧美熟妇xx| 欧美大片免费| 日韩一区二区三区观看| 亚洲欧美视频在线播放| 久久社区一区| 久久久久久91香蕉国产| 国产在线观看你懂的| 美女精品网站| 91在线免费看片| 精品电影在线| 亚洲乱码国产乱码精品精98午夜 | 日韩欧美视频一区二区三区四区| 国产传媒在线播放| 欧美性猛交xxx| 在线观看中文av| 九色精品国产蝌蚪| 欧美极品少妇xxxxⅹ裸体艺术 | 好吊日av在线| 欧美三级三级三级爽爽爽| 日本wwwwwww| 第一社区sis001原创亚洲| 久久免费成人精品视频| 中文字幕在线观看视频一区| 成人白浆超碰人人人人| 亚洲欧美日韩不卡一区二区三区| 白白色在线观看| 91精品国产91久久综合桃花| 精品国产av无码| 99亚洲一区二区| 91传媒视频免费| 成人亚洲综合天堂| 欧美日韩久久久久| www.美色吧.com| 影音先锋日韩在线| 国产九九精品视频| 国产永久免费高清在线观看视频| 亚洲综合视频网| www.色就是色.com| 日韩欧美高清在线播放| 日本老师69xxx| 殴美一级特黄aaaaaa| 一区二区三区欧美久久| 手机av在线网| 99精品视频在线| 国产成人精品一区二区三区| 完全免费av在线播放| 亚洲在线国产日韩欧美| 99精品国产一区二区| 麻豆av在线免费看| 欧美日韩国产在线观看| 夜夜春很很躁夜夜躁| 玖玖视频精品| 日本一区免费| 日本精品另类| 国产一区二区三区日韩欧美| 91视频在线视频| 国产精品日本一区二区三区在线| 成人性色生活片| 精品午夜一区二区三区| 国产桃色电影在线播放| 精品成人一区二区三区| 久久精品国产亚洲AV无码男同| 国产盗摄一区二区三区| 少妇久久久久久被弄到高潮| 久久丁香四色| 久久久久久com| 免费观看成年人视频| 午夜久久电影网| 黄色性生活一级片| 久久久久久黄| 伊人久久大香线蕉综合75| 热久久久久久| 久久69精品久久久久久久电影好| www.国产欧美| 午夜av区久久| 久久亚洲AV无码专区成人国产| 奇米色777欧美一区二区| 亚洲欧洲一区二区福利| 精品国产不卡一区二区| 欧美国产日韩一区二区三区| 精品毛片在线观看| 午夜久久福利影院| 国产视频三区四区| 无码小电影在线观看网站免费| 欧美三区免费完整视频在线观看| 熟女av一区二区| 国产成人亚洲综合色影视| 丁香花在线影院观看在线播放| 色天下一区二区三区| 国产成人精品免费久久久久| 日本视频在线观看| 精品电影一区二区| 这里只有精品免费视频| 亚洲欧美一区二区三区久本道91| 国产一级免费片| 日韩福利视频导航| 特级黄色录像片| 你懂的在线观看一区二区| 国产精品av在线| 亚洲91av| 亚洲图片欧美午夜| 性中国xxx极品hd| 欧洲精品中文字幕| 黄色一级视频免费| 国产亚洲精品福利| 香蕉久久久久久av成人| 日韩有码一区二区三区| 国产一级不卡视频| 日韩av在线中文字幕| 国产99视频精品免费视频36| 亚洲精品一区三区三区在线观看| 欧美老女人在线视频| 黄色在线播放| 亚洲精品在线观看网站| 一级做a爱片久久毛片| 婷婷六月综合亚洲| 91香蕉一区二区三区在线观看| 91一区一区三区| 免费欧美一级片| 丝袜国产日韩另类美女| 91免费黄视频| 欧美在线观看天堂一区二区三区| 免费看污久久久| 91精品入口| 91九色国产视频| 亚洲电影有码| 欧美中文在线观看国产| 国产乱码在线| 久久国产精品久久久久久| 国产精品视频一区二区久久| 亚洲第一综合天堂另类专| 99精品人妻无码专区在线视频区| 91黄色激情网站| 日本视频在线观看免费| 亚洲成人7777| 精品在线免费观看视频| 亚洲免费色视频| 精品人体无码一区二区三区| www久久精品| 国产草草浮力影院| 国产精品99久久久久久宅男| 日韩高清第一页| 蜜桃av噜噜一区二区三区小说| 欧美激情成人网| 国产精品美女久久久| 69sex久久精品国产麻豆| 欧美va天堂| 国内自拍中文字幕| 这里只有精品在线| 中文字幕av导航| 99精品电影| 在线综合视频网站| 97精品一区二区| 一区二区不卡在线观看| 青青草国产成人a∨下载安卓| 无遮挡亚洲一区| 成人在线免费小视频| 日韩欧美精品一区二区| 日韩在线欧美| 艳母动漫在线免费观看| 91精品亚洲| 一本色道久久88亚洲精品综合| 亚洲国产精品日韩专区av有中文 | 青青草在线播放| 亚洲精品自产拍| 国产资源在线看| 一区二区三区精品99久久| 国产精品秘入口| 中文字幕日韩精品在线观看| 日本黄色片在线观看| 欧美成人黄色小视频| 女人天堂av在线播放| 91精品国产91久久久久久不卡| 国产免费拔擦拔擦8x在线播放 | 成人av地址| 精品国产电影| 欧州一区二区| 色中文字幕在线观看| 国模 一区 二区 三区| 青青草精品视频在线| 免费亚洲婷婷| 伊人网在线综合| 国产高清精品网站| 极品粉嫩小仙女高潮喷水久久| 国产亚洲污的网站| 一区二区三区影视| 午夜av电影一区| 波多野结衣电车痴汉| 欧美一区二区三区免费视频| 你懂的网站在线| 国产性猛交xxxx免费看久久| 国产素人视频在线观看| 国内精久久久久久久久久人| 欧美xxxx做受欧美护士| 亚洲综合日韩在线| 91精品国产综合久| 91丨porny丨中文| 娇妻被老王脔到高潮失禁视频| 成人免费在线视频观看| 日本少妇裸体做爰| 欧美三级电影精品| 日本黄色大片视频| 自拍偷拍亚洲在线| 操喷在线视频| 国产精品久久久久久久久久新婚| 欧美一级片网址| 欧美精品久久| 欧美日韩亚洲一区二区三区在线| 日韩精品视频久久| 国产乱国产乱300精品| 免费观看av网站| 一区二区三区久久| 久草热在线观看| 亚洲精品成人免费| 精品自拍一区| 国产精品96久久久久久| 成人av地址| 久久国产精品免费观看| 日韩电影在线免费看| 日本三级日本三级日本三级极| 国产精品久久久久久久久动漫| www.国产成人| 欧美tk—视频vk| 精品麻豆一区二区三区| 国产精品久久久久久久av电影| 久久黄色影视| 免费的av在线| 久久激情五月激情| 波多野结衣一本| 亚洲国产成人av| 99视频在线观看免费| 日本中文字幕一区二区有限公司| 成年在线观看视频| 精品亚洲国内自在自线福利| 国产精久久一区二区三区| 午夜视频一区二区三区| 亚洲第一第二区| 久久夜色精品亚洲噜噜国产mv | 2014国产精品| 图片区亚洲欧美小说区| 韩国中文字幕av| 国产激情一区二区三区四区 | 成人免费高清在线播放| 欧美有码在线观看视频| 粉嫩的18在线观看极品精品| 欧美xxxx吸乳| 国产最新精品精品你懂的| 影音先锋制服丝袜| 在线观看免费一区| 国产1区2区3区在线| 日本aⅴ大伊香蕉精品视频| 牛牛精品成人免费视频| 久久成人免费观看| www.日韩精品| 毛片基地在线观看| 日韩av在线一区二区| 乱人伦视频在线| 免费在线观看91| 玖玖玖国产精品| 懂色av蜜桃av| 欧美亚洲高清一区| 天堂中文а√在线| 成人午夜小视频| 一区二区三区四区日韩| 手机在线观看日韩av| 一区二区三区精品视频在线| 亚洲美女福利视频| 高清欧美性猛交xxxx| 久久香蕉网站| 成人精品视频一区二区| 国产亚洲精品aa| 亚洲天堂中文在线| 久久久久999| 高清日韩中文字幕| 99爱视频在线| 中文久久乱码一区二区| 97超视频在线观看| 久久99久久99精品免观看粉嫩| 超碰精品在线| 久久久久狠狠高潮亚洲精品| 国产蜜臀97一区二区三区 | 精品视频在线一区二区在线| 亚洲一区不卡在线| 国产成人在线视频免费播放| 黄色一级片免费看| 国产亚洲精品一区二区| 亚洲成人精品综合在线| 免费人成自慰网站| 国产亚洲福利社区一区| 亚洲a区在线视频| 国产欧美亚洲精品a| 福利视频999| 午夜视频一区二区| www.久久热.com| 91偷拍精品一区二区三区| 亚洲一区欧美二区| 登山的目的在线| 亚洲黄色成人网| 免费视频观看成人| 日韩在线观看a| 久久精品一区蜜桃臀影院| 国产精品久久影视| 欧美中文在线字幕| 91精品电影| 色噜噜日韩精品欧美一区二区| 欧美精品自拍偷拍| 欧美调教sm| 51xx午夜影福利| 国产欧美一区二区三区在线看蜜臀 | 国精产品一区| 精品蜜桃传媒| 国产精品原创巨作av| 一级一片免费看| 国语自产在线不卡|