精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一本一道综合狠狠老| 亚洲+小说+欧美+激情+另类 | 午夜激情综合网| 狠狠色噜噜狠狠狠狠色吗综合| 五月婷婷色丁香| 久久综合电影| 亚洲国产精品成人精品| 色诱视频在线观看| 免费**毛片在线| 国产成人99久久亚洲综合精品| 国模精品视频一区二区三区| av中文字幕免费观看| 国产高清日韩| 欧美午夜视频一区二区| 五月天综合婷婷| 日本a一级在线免费播放| 国产一区在线观看视频| 欧美做受高潮电影o| 国产97免费视频| 欧美精品系列| 日韩国产欧美精品在线| 中文字幕一区二区三区四| 天堂а√在线最新版中文在线| 亚洲欧洲日韩女同| 日本视频一区二区不卡| 欧美在线精品一区二区三区| 精品一区二区三区久久久| 欧美一区第一页| 国产精彩视频在线观看| 91精品国产91久久综合| 色777狠狠综合秋免鲁丝| 91玉足脚交白嫩脚丫| 日本在线视频一区二区三区| 在线观看网站黄不卡| 欧妇女乱妇女乱视频| 91激情在线| 日本一区二区三区四区在线视频| 精品国产一区二区三区麻豆免费观看完整版 | 欧美成人激情免费网| 四季av一区二区三区| 亚洲精品国产嫩草在线观看| 大荫蒂欧美视频另类xxxx| 国产91在线亚洲| 国产盗摄在线观看| 亚洲欧美在线aaa| 亚洲无玛一区| 2019中文字幕在线视频| 日本一区二区在线不卡| 日本公妇乱淫免费视频一区三区| 日韩电影免费| 久久中文娱乐网| 久久久一本精品99久久精品66| 欧美一级一区二区三区| 成人av网址在线| 国产伦精品一区二区三区视频孕妇| 国内精品偷拍视频| 国产a久久麻豆| 国产经品一区二区| 天堂在线资源网| 97久久超碰国产精品| 久久综合婷婷综合| 波多野结衣在线网站| 国产精品美女一区二区三区| 亚洲高清在线播放| 国产精品va在线观看视色| 亚洲另类中文字| 国产一区二区三区小说| 美女网站在线看| 色综合久久66| 九九热99视频| 豆花视频一区二区| 亚洲精品tv| 最新欧美精品一区二区三区| 老司机av福利| 女囚岛在线观看| 欧美日韩国产页| 国产精品人人爽人人爽| 高清不卡一区| 亚洲大胆美女视频| 麻豆精品免费视频| 97精品国产福利一区二区三区| 久久国产精品电影| 日韩三级一区二区三区| 日本欧美久久久久免费播放网| 91精品久久久久久久久青青| 亚洲精品综合久久| 久久色.com| 中国一级黄色录像| 欧美久久天堂| 欧美日韩美女一区二区| 亚洲国产精品狼友在线观看| 九九久久电影| 欧美xxxx做受欧美| 无码人妻av免费一区二区三区 | 色婷婷.com| 成人av动漫| 国产香蕉97碰碰久久人人| 久久中文免费视频| 久久五月激情| 99在线观看视频| 国产黄色免费在线观看| 亚洲一卡二卡三卡四卡| 亚洲欧美国产中文| 外国精品视频在线观看 | 日韩精品极品毛片系列视频| 国产91丝袜美女在线播放| 女人香蕉久久**毛片精品| 欧美中文字幕在线| www三级免费| 国产日本亚洲高清| 日韩五码在线观看| 久久久久久爱| 综合国产在线观看| 黄色片免费观看视频| 精品午夜久久福利影院 | 天天av综合| 日本一区二区三区四区视频| www国产一区| 国产精品国产自产拍在线| 鲁一鲁一鲁一鲁一澡| 日韩三级不卡| 久久久www成人免费精品张筱雨| 国产免费av一区| 成人免费毛片嘿嘿连载视频| 精品制服美女丁香| aaa级精品久久久国产片| 伊人免费在线| 色菇凉天天综合网| 免费成人深夜夜行p站| 欧美日韩精品| 亚洲va男人天堂| 亚洲搞黄视频| 欧美午夜理伦三级在线观看| 久久无码人妻精品一区二区三区 | 第四色在线一区二区| 久久精品亚洲94久久精品| 看黄色一级大片| 91麻豆成人久久精品二区三区| 国产精品69久久久| 综合伊人久久| 欧美激情精品在线| 性欧美18一19性猛交| 亚洲色图在线视频| 黄色三级视频在线| 欧洲杯什么时候开赛| 国产91热爆ts人妖在线| 日韩电影免费| 91国产免费看| 欧美黄色高清视频| 蜜桃av一区二区三区电影| 色一情一乱一伦一区二区三区丨 | 日本不卡的三区四区五区| 欧美午夜精品理论片a级大开眼界| 蜜桃视频m3u8在线观看| 日韩久久午夜影院| 无码人妻av一区二区三区波多野 | 日韩成人在线播放| 成人免费看片98欧美| 91免费观看视频| 久久人妻精品白浆国产| 国产精品密蕾丝视频下载 | 欧美三级一级片| 亚洲精品亚洲人成在线观看| 国产成人+综合亚洲+天堂| 成人免费黄色网页| 欧美日韩成人一区二区| 国产精品精品软件男同| 国产精品一二三| 加勒比成人在线| 国产精品一国产精品| 国产精品视频一区国模私拍| 国产精品扒开做爽爽爽的视频| 日韩欧美资源站| 五月天婷婷久久| 日本一区二区视频在线| 能看毛片的网站| 国产亚洲精品久久久久婷婷瑜伽| 日本午夜精品一区二区三区| 日韩三级一区| 久久久久国产精品免费| 毛片免费在线播放| 7777精品伊人久久久大香线蕉的 | 国产白丝一区二区三区 | 欧美精品黑人性xxxx| 黄色一级片在线| 91在线视频播放| 久久久久久久久久久久91| 欧美 日韩 国产一区二区在线视频 | 欧美色女视频| 波多野结衣久草一区| 欧美www.| 欧美激情网友自拍| 成人午夜在线观看视频| 精品剧情在线观看| 中文人妻熟女乱又乱精品| 亚洲综合999| www久久久久久久| 成人午夜激情视频| 日本三级黄色网址| 国产日韩一区二区三区在线播放 | 69精品人人人人| www.日本精品| 亚洲自拍欧美精品| 国产免费嫩草影院| 91丨九色porny丨蝌蚪| 亚洲欧美日韩网站| 久久精品主播| 日韩欧美猛交xxxxx无码| 欧美日一区二区| 久久久久久久久一区二区| 成人噜噜噜噜| 国产免费成人av| 韩国成人漫画| 久久免费精品日本久久中文字幕| 99青草视频在线播放视| 日韩电视剧在线观看免费网站 | 丰满少妇久久久久久久| 婷婷免费在线观看| 老司机精品久久| 欧美成人三级在线视频| 一区二区三区四区电影| 亚洲欧美丝袜| 精品一区二区三区的国产在线观看| 国产传媒一区| 日本亚洲视频| 91最新国产视频| 成人激情久久| 成人综合网网址| 91精品店在线| 国产精品第一第二| 日本综合字幕| 日本精品视频在线| 成人性生交大片免费网站| 97视频在线观看视频免费视频 | 亚洲精品中文字幕有码专区| 手机看片一区二区三区| 精品久久一区二区| 黄色小视频免费观看| 日韩三级精品电影久久久| hs视频在线观看| 欧美一级日韩不卡播放免费| 一二三四区在线| 欧美嫩在线观看| 国产精品欧美激情在线| 欧美精品亚洲一区二区在线播放| 一区二区乱子伦在线播放| 在线精品国精品国产尤物884a| 国产在线观看黄色| 色8久久精品久久久久久蜜| 天堂网中文字幕| 欧美亚洲一区三区| 中文字幕无码乱码人妻日韩精品| 欧美视频一区在线| 在线观看不卡的av| 91精品国产综合久久久蜜臀粉嫩 | 国产精品一区二区6| 欧美日韩国产限制| 波多野结衣一区二区三区在线| 91精品1区2区| 国产美女主播在线观看| 日韩欧美专区在线| 午夜视频福利在线| 亚洲人av在线影院| 四虎久久免费| 美女视频黄免费的亚洲男人天堂| 性欧美高清come| 久久久久久久香蕉网| 在线视频超级| 国产精品日韩在线一区| 97精品资源在线观看| 国产不卡一区二区三区在线观看| 欧美交a欧美精品喷水| 女女同性女同一区二区三区91| av一区二区在线播放| 中国黄色录像片| 亚洲美女黄色| 国产精品入口免费软件| 国产酒店精品激情| 中文字幕xxx| 中文字幕一区二区三区不卡在线| 久久国产精品波多野结衣av| 欧美午夜激情视频| 国产精品伊人久久| 亚洲二区在线播放视频| 国产裸舞福利在线视频合集| 操人视频在线观看欧美| 青青青免费在线视频| 国产日韩欧美在线看| 超碰精品在线| 亚洲高清乱码| 一区二区三区国产盗摄| 玖玖爱视频在线| av成人动漫在线观看| 91av手机在线| 精品久久久久久久久久ntr影视| 在线观看中文字幕网站| 亚洲成人三级在线| 久操免费在线| 日韩av日韩在线观看| 日韩免费高清视频网站| 日本一区高清不卡| 黄色亚洲精品| 中文字幕精品一区二区三区在线| av网站免费线看精品| 老司机成人免费视频| 岛国av一区二区在线在线观看| 国产欧美熟妇另类久久久| 亚洲精品一区在线观看香蕉| 男女在线观看视频| 国产欧亚日韩视频| 欧美人与物videos另类xxxxx| 久久久久久久香蕉| 久久99国内精品| 国产免费一区二区三区网站免费| 亚洲成人中文在线| av中文字幕在线免费观看| 中文字幕一区电影| 中文字幕21页在线看| 国产精品日韩高清| 欧美黄色一区二区| 日本黄色福利视频| 日本一区二区三区视频视频| 在线观看国产亚洲| 精品蜜桃在线看| 日韩精品卡一| 97免费高清电视剧观看| 全部毛片永久免费看| 青青国产精品| 99久久久久久| 欧美大陆一区二区| 午夜日韩电影| 亚洲丰满在线| 国产精品美女在线观看直播| 午夜啪啪福利视频| 另类人妖一区二区av| 中文字幕av久久爽一区| 色婷婷久久久亚洲一区二区三区 | 日韩精品影音先锋| 中文字幕欧美激情极品| 久久久亚洲午夜电影| 日本五十熟hd丰满| 精品卡一卡二卡三卡四在线| 日韩少妇视频| 福利精品视频| 精品动漫一区| 黄色污在线观看| 亚洲va欧美va天堂v国产综合| 男人天堂一区二区| 2019中文字幕在线免费观看| 欧洲亚洲一区二区三区| 波多野结衣50连登视频| 久久青草欧美一区二区三区| 久久黄色精品视频| 亚洲一区二区久久| 国产精品xxx| 香蕉视频在线网址| 国产成人在线看| 日韩精品视频免费播放| 日韩av最新在线| 国模套图日韩精品一区二区| 色视频一区二区三区| 裸体一区二区三区| 欧美日韩在线视频免费| 欧美精品一区二区在线观看| 国产精品xx| 日韩三级在线播放| 久久精品国产亚洲一区二区三区| 黄色一级大片在线免费观看| 日韩欧美国产三级| 久草在线资源站手机版| 欧美综合激情| 国产主播一区二区| 国产精品白浆一区二小说| 精品伊人久久97| 成人午夜sm精品久久久久久久| 亚洲区成人777777精品| 成人视屏免费看| 波多野结衣小视频| 欧美日本在线视频中文字字幕| 卡通动漫国产精品| www.久久久精品| 亚洲午夜久久久| 成人高清网站| 国产精品乱码一区二区三区| 久久福利毛片| 免费麻豆国产一区二区三区四区| 日韩精品丝袜在线| 亚洲网站三级| 你懂的av在线| 亚洲婷婷在线视频| 日韩av视屏| 亚洲综合中文字幕在线观看| 国产精品老牛| 国产女人被狂躁到高潮小说| 精品偷拍各种wc美女嘘嘘| 国产95亚洲| 妞干网在线免费视频| 一区二区三区四区视频精品免费| 国产乱子伦三级在线播放| 97超级碰碰|