了解類加載器嗎?類加載器的類型有哪些?

一、什么是類加載器(ClassLoader)

類加載器是 Java 虛擬機中的一部分,負責將 .class 文件加載到 JVM 內存中,生成對應的 Class 對象。

Java 程序中所有的類在使用前都必須通過類加載器加載進 JVM,才能被執行。


二、類加載器的作用

  • 加載 .class 文件到內存中。
  • 將字節碼轉換為 JVM 能識別的 Class 對象。
  • 實現類的 命名空間隔離
  • 支持 模塊化開發(如插件機制、自定義業務模塊加載)。

三、類加載器的分類(JVM 內置 + 用戶自定義)

1. 啟動類加載器(Bootstrap ClassLoader)

  • 作用: 加載 JVM 的核心類庫,如 java.lang.*java.util.* 等。
  • 加載路徑: JAVA_HOME/lib 目錄中的類(如 rt.jar)。
  • 實現: 由 C/C++ 實現,是 JVM 的一部分。
  • 特點: 不是 Java 類,不能被直接引用或操作。

2. 擴展類加載器(Extension ClassLoader)

  • 作用: 加載 Java 擴展類庫。
  • 加載路徑: JAVA_HOME/lib/ext/ 目錄或由 java.ext.dirs 系統變量指定的路徑。
  • 父加載器: Bootstrap ClassLoader。
  • 類名: sun.misc.Launcher$ExtClassLoader

3. 應用類加載器 / 系統類加載器(Application ClassLoader)

  • 作用: 加載用戶類路徑(classpath)下的類文件。
  • 加載路徑: 當前應用的 classpath(如 jar 包或類文件所在目錄)。
  • 父加載器: Extension ClassLoader。
  • 類名: sun.misc.Launcher$AppClassLoader

4. 自定義類加載器(Custom ClassLoader)

  • 作用: 開發者可以繼承 java.lang.ClassLoader 實現自己的加載邏輯。

  • 使用場景:

    • 熱部署
    • 模塊化(如 OSGi)
    • 插件系統
    • 加密 class 文件
  • 常見方式:

    • 繼承 ClassLoader 并重寫 findClass() 方法
    • 調用 defineClass() 定義類對象

四、類加載器的層次結構圖

┌──────────────────────────┐
│ Bootstrap ClassLoader    │
│ (C++實現, 加載核心類庫)     │
└──────────┬───────────────┘↓
┌──────────────────────────┐
│ Extension ClassLoader    │
│ (加載 ext 目錄類)          │
└──────────┬───────────────┘↓
┌──────────────────────────┐
│ Application ClassLoader  │
│ (加載classpath下類)        │
└──────────┬───────────────┘↓
┌──────────────────────────┐
│ 自定義 ClassLoader       │
│ (可指定加載路徑/策略)     │
└──────────────────────────┘

五、雙親委派機制(Parent Delegation Model)

定義:

類加載器在加載類時,首先會 將加載請求委托給父加載器,由頂層的 Bootstrap 開始查找,只有在父加載器找不到時,才由當前加載器加載。

加載流程:

  1. 當前類加載器收到類加載請求。
  2. 委托給父類加載器。
  3. 如果父類無法加載,才由當前加載器嘗試加載。

優點:

  • 避免類的重復加載。
  • 防止用戶自定義類覆蓋 JDK 核心類(如 java.lang.String)。

舉例說明:

public class Test {public static void main(String[] args) {System.out.println(String.class.getClassLoader()); // null(Bootstrap)System.out.println(Test.class.getClassLoader());   // AppClassLoader}
}

六、自定義類加載器示例

public class MyClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] data = loadClassData(name); // 從文件或網絡中讀取字節數組return defineClass(name, data, 0, data.length);}
}

七、線程上下文類加載器(ContextClassLoader)

定義:

  • 每個線程可以設置自己的類加載器,用于動態加載類或資源。
  • 默認是 Application ClassLoader

用途:

  • 在 Java SPI(Service Provider Interface)中尤為重要。
  • 解決雙親委派帶來的靈活性限制。
Thread.currentThread().setContextClassLoader(new MyClassLoader());

八、類加載器相關方法(Java API)

方法說明
loadClass(String name)加載類(會委托給父類)
findClass(String name)查找類(自定義類加載核心)
defineClass(...)將字節數組轉為 Class 對象
getParent()獲取父加載器
getClassLoader()獲取當前類的加載器

九、面試常問點總結

問題要點回答
什么是類加載器?.class 加載進內存,生成 Class 對象。
JVM 有哪些類加載器?啟動類、擴展類、應用類、自定義類加載器。
雙親委派模型是什么?加載委托給父加載器,避免重復 & 保證安全性。
如何打破雙親委派?重寫 loadClass() 不委托父類。
自定義類加載器的用途?插件、加密、安全、熱更新、動態部署等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92119.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92119.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP面向對象高級特性:魔術方法、對象迭代器與設計模式應用

引言 在前一篇文章中,我們探討了PHP的Traits、匿名類和對象比較機制。本文將深入PHP面向對象編程的更多高級特性,包括魔術方法、對象迭代器以及常用設計模式的實際應用,這些特性能夠幫助開發者構建更加靈活和強大的面向對象系統。 魔術方法深度解析 魔術方法是PHP中一組以…

【Java基礎】一個月教你輕松掌握Java——第三篇Git

一、Java概述&#xff08;之前的文章&#xff09;二、版本控制工具Git其實這個與Java基礎關系不大&#xff0c;但是這個工具還是很重要的&#xff0c;不管是團隊之間打比賽還是就業都應該學會它&#xff0c;秉持著學的早一些&#xff0c;用的時間長一點&#xff0c;會更熟練。&…

【C# in .NET】16. 探秘類成員-索引器:通過索引訪問對象

探秘類成員-索引器:通過索引訪問對象 在 C# 中,索引器(Indexer)是一種獨特的類成員,它允許類或結構的實例像數組一樣被索引訪問,為數據訪問提供了極大的靈活性。本文將從基礎概念出發,深入.NET 框架底層,剖析索引器的實現機制,并通過實戰案例展示其強大的應用價值。 …

idea出現:java: Target level ‘1.7‘ is incompatible with source level ‘1.8‘.解決辦法

在文件->設置->java編譯器&#xff0c;把這里版本對應上。這里用的是8版本

ssms(SQL 查詢編輯器) 添加快捷鍵 Ctrl+D(功能等于Ctrl+C + Ctrl+V),一步到位

1,打開ssms 工具&#xff0c;打開對應添加快捷鍵得地方2&#xff0c;分配 快捷鍵3&#xff0c;看效果

數學建模--層次分析法

層次分析法&#xff08;AHP&#xff09;筆記 一、核心概念 &#xff08;一&#xff09;問題本質 面對多方案、多準則決策&#xff0c;將復雜問題分層拆解&#xff0c;通過定性與定量結合&#xff0c;確定各因素權重&#xff0c;選出最優方案&#xff0c;比如選“微博之星”時綜…

人工智能教研室暑期培訓flask全棧開發培訓

人工智能教研室暑期培訓flask全棧開發培訓第一天&#xff1a;Flask 基礎入門與環境搭建實踐項目&#xff1a;搭建個人博客首頁&#xff0c;包含文章列表與詳情頁上午&#xff1a;環境搭建與 Flask 基礎1. 安裝 Python 與虛擬環境配置2. Flask 框架簡介與第一個 "Hello Wor…

MySQL(141)如何處理重復數據問題?

處理重復數據問題是數據管理中的一個常見挑戰。重復數據會影響數據庫的性能、占用資源&#xff0c;并且可能導致數據分析結果的偏差。以下是處理重復數據問題的詳細步驟以及結合代碼的示例。 一、識別重復數據 首先&#xff0c;需要識別數據庫中的重復數據。可以使用 SQL 查詢來…

MySQL 核心知識點梳理(3)

目錄 SQL優化 23什么是慢SQL 如何優化呢? 如何利于覆蓋索引 如何使用聯合索引 如何進行分頁優化 Join代替子查詢 為什么要小表驅動大表? 為什么避免join太多的表? 如何進行排序優化 什么是filesort 全字段排序和rowid排序 條件下推 索引 索引為什么能提高MyS…

關于注冊登錄功能制作的步驟(文件IO存儲+LVGL彈窗提示)

按你的需求&#xff08;文件IO存儲LVGL彈窗提示&#xff09;&#xff0c;工程需創建以下文件&#xff0c;代碼按功能模塊化存放&#xff0c;清晰明了&#xff1a;一、需要創建的文件清單 文件名 作用 存放內容 main.c 程序入口 主函數、硬件初始化、LVGL初始化、啟動界面 ui.…

自媒體端后臺設計指南:從注冊認證到內容管理的全流程搭建

自媒體端后臺設計指南&#xff1a;從注冊認證到內容管理的全流程搭建自媒體端后臺是專業創作者管理內容、粉絲和數據的核心陣地&#xff0c;其設計直接影響創作效率和平臺運營質量。一個功能清晰、操作便捷的后臺系統&#xff0c;能讓創作者專注于內容生產&#xff0c;而非被復…

uniapp掃描二維碼反色處理

在開發掃描二維碼過程中&#xff0c;發現白底黑碼可以直接用uni.scanCode掃描出來&#xff0c;但是黑底白碼就掃不出來&#xff0c;于是就試試反色后的二維碼能不能掃描出來&#xff0c;沒想到真的可以&#xff0c;下面附上完整代碼&#xff1a; <u-icon name"scan&quo…

C語言定義fixed_t什么意思

在 C 語言中&#xff0c;fixed_t 通常是一個自定義的類型別名&#xff08;typedef&#xff09;&#xff0c;用于表示固定點數&#xff08;Fixed-Point Number&#xff09;&#xff0c;而非 C 語言標準庫中的原生類型。它主要用于需要高效實數運算但無法使用浮點數的場景&#x…

音頻3A處理簡介之ANS(自動噪聲抑制)

我們常用的手機、消費類攝像頭等產品的麥克風所采集的原始聲音信號中往往包含了比較多的背景噪音&#xff0c;不僅影響用戶錄音和回放的使用體驗&#xff0c;而且這些噪聲數據還會降低音頻編碼的壓縮效率&#xff0c;因此有必要對音頻底噪進行抑制處理&#xff0c;這就是ANS&am…

Python 使用期物處理并發(使用concurrent.futures模塊啟動 進程)

使用concurrent.futures模塊啟動進程 concurrent.futures 模塊的文檔 &#xff08;https://docs.python.org/3/library/concurrent.futures.html&#xff09;副標題 是“Launching parallel tasks”&#xff08;執行并行任務&#xff09;。這個模塊實現的是真正 的并行計算&…

【系統全面】Linux內核原理——基礎知識介紹

理解內核&#xff1a;內核原理 計算機系統的軟件分層 不同于單片機中使用代碼直接與硬件交互&#xff0c;對于這種方式的缺點深有&#xff1a; &#xff08;1&#xff09;復雜度高&#xff0c;調用難度高&#xff0c;需要深入理解硬件的工作原理和細節。 &#xff08;2&#xf…

Oracle自治事務——從問題到實踐的深度解析

一、引言&#xff1a;當“關鍵操作”遇上主事務的“生死綁定”?先問大家一個問題&#xff1a;假設你在開發一個用戶管理系統&#xff0c;核心功能是“用戶注冊”&#xff0c;同時需要記錄“操作日志”。某天&#xff0c;用戶提交注冊信息時&#xff0c;數據庫突然因磁盤空間不…

廣播(Broadcast)和組播(Multicast)對比

概述 廣播&#xff08;Broadcast&#xff09;和組播&#xff08;Multicast&#xff09;是計算機網絡中兩種重要的一對多通信方式&#xff0c;用于高效地將數據同時分發給多個接收者&#xff0c;它們的核心區別在于目標接收者的范圍和控制精度&#xff0c;基于業務對效率、規模和…

在 HTTP GET 請求中傳遞參數有兩種標準方式

方法 1&#xff1a;URL 查詢參數&#xff08;Query Parameters&#xff09;格式&#xff1a;?參數名值&參數名2值2示例請求http://localhost:8080/hello?name張三&age25后端接收方式GetMapping("/hello") public String sayHello(RequestParam String name…

pycharm windows/linux/mac快捷鍵

適用于mac的快捷鍵 適用于windows和linux的快捷鍵 參考資料&#xff1a; https://www.jetbrains.com/zh-cn/help/pycharm/mastering-keyboard-shortcuts.html