Java9及之后關于類加載器的新特性

為了保證兼容性,JDK9沒有從根本上改變三層類加載器的架構和雙親委派模型,但為了模塊化系統的順利運行,仍然發生了一些值得被注意的變動

一、變動1

由于引入了模塊化概念,所以不同的類加載器回去加載屬于不同模塊的類

啟動類加載器
在這里插入圖片描述
平臺類加載器
在這里插入圖片描述
應用類加載器

在這里插入圖片描述

二、變動二

擴展機制被移除,但是擴展類加載器由于向后兼容性的原因被保留,然后被重命名為平臺類加載器Platform ClassLoader,可以通過ClassLoader的新增方法getPlatformClassLoader來獲取。

原因: JDK9是基于模塊化進行構建的,它將原來的rt.jar和tools.jar拆分成了很多的JMOD文件,文件中的Java類庫已經天然地滿足了可擴展的需求,所以擴展機制已經沒有繼續存在的價值了。

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

在這里插入圖片描述

三、變動三

平臺類加載器和應用程序類加載器都不再繼承于java.net.URLClassLoader,而是繼承于jdk.internal.loader.BuiltinClassLoader,并且連啟動類加載器都是。

在這里插入圖片描述

四、變動四

類加載器有了名稱屬性,該名稱可以在構造方法中進行指定,通過getName方法來獲取。應用類加載器的默認名稱是app,平臺類加載器的默認名稱是platform。

五、變動五

啟動類加載器現在是由JVM內部和Java類庫共同協作實現的類加載器,但為了與之前代碼進行兼容,在嘗試獲取啟動類加載器時仍然會返回null,而不會得到對應的BootClassLoader實例。

六、變動六

類加載的委派關系發生了變動。

在這里插入圖片描述

  • 對比
  • 在JDK9之前的版本中,當擴展及應用程序類加載器收到類加載請求,會委派給父加載器加載,只有當父加載器反饋自己無法完成這個加載請求時,才會由子類加載器嘗試進行加載。
  • 在JDK9之后的版本中,當平臺及應用程序類加載器收到類加載請求,在委派給父加載器加載前,要先判斷該類是否能夠歸屬到某一個系統模塊中,如果可以找到這樣的歸屬關系,就要優先委派給負責那個模塊的加載器完成加載

七、測試代碼

public class DemoApplication {public static void main(String[] args) {System.out.println(DemoApplication.class.getClassLoader());System.out.println(DemoApplication.class.getClassLoader().getParent());System.out.println(DemoApplication.class.getClassLoader().getParent().getParent());// 獲取系統類加載器System.out.println(ClassLoader.getSystemClassLoader());// 獲取平臺類加載器System.out.println(ClassLoader.getPlatformClassLoader());// 獲取類的加載器的名稱System.out.println(DemoApplication.class.getClassLoader().getName());System.out.println(DemoApplication.class.getClassLoader().getParent().getName());ModuleLayer layer = ModuleLayer.boot();Set<Module> allModules = layer.modules();//打印所有已加載模塊及其對應的類加載器for (Module module : allModules) {ClassLoader classLoader = module.getClassLoader();ModuleDescriptor descriptor = module.getDescriptor();System.out.println("Module: " + descriptor.name() +", Class Loader: " + classLoader);}}
}

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

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

相關文章

Nginx負載均衡實戰

&#x1f3b5;負載均衡組件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模塊允許Nginx定義一組或多組節點服務器組&#xff0c;使用時可以通過多種方式去定義服務器組 樣例&#xff1a; upstream backend {server back…

從零開發短視頻電商 在AWS SageMaker已創建的模型列表中進行部署

1.導航到 SageMaker 控制臺。 2.在 SageMaker 控制臺的左側導航欄中&#xff0c;選擇 “模型” 選項。 3.在模型列表中&#xff0c;找到您要部署的模型。選擇該模型。 4.點擊 “創建端點” 選項或者點擊 “創建端點配置” 選項都可以進行部署。 選擇創建端點進去后還是會進行…

k8s中部署基于nfs的StorageClass

部署nfs服務 1.1 創建基礎鏡像(選做) 如果以docker的形式部署nfs server, 參考此步驟, 若否, 該步驟可忽略。 mkdir /data/nfs -p chmod 755 /data/nfs# NFS默認端口: 111、2049、20048 docker run -d \ --privileged \ --name nfs_server \ -p 111:111/tcp \ -p 111:111/ud…

[CTFshow 紅包挑戰] 刷題記錄

文章目錄 紅包挑戰7紅包挑戰8紅包挑戰9 紅包挑戰7 考點&#xff1a;xdebug拓展 源碼 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd s…

1832_org-mode的注釋處理

Grey # :OPTIONS ^:nil org-mode的注釋處理 關于這部分其實比較簡單&#xff0c;在我現在的使用訴求上來說要求不多。但是我覺得如果考慮以后把文學式編程作為一種開發的主要體驗的話&#xff0c;掌握這樣的操作很有必要。因為我可以控制部分信息的輸出。 自然&#xff0c;控…

LeetCode-數組-重疊、合并、覆蓋問題-中等難度

435. 無重疊區間 我認為區間類的題型&#xff0c;大多數考驗的是思維能力&#xff0c;以及編碼能力&#xff0c;該類題型本身并無什么算法可言&#xff0c;主要是思維邏輯&#xff0c;比如本題實際上你只需要能夠總結出重疊與不重疊的含義&#xff0c;再加上一點編碼技巧&#…

go-zero開發入門-API服務開發示例

接口定義 定義 API 接口文件 接口文件 add.api 的內容如下&#xff1a; syntax "v1"info (title: "API 接口文件示例"desc: "演示如何編寫 API 接口文件"author: "一見"date: "2023年12月07日"version: "…

Spring Boot 優雅地處理重復請求

前 言 對于一些用戶請求&#xff0c;在某些情況下是可能重復發送的&#xff0c;如果是查詢類操作并無大礙&#xff0c;但其中有些是涉及寫入操作的&#xff0c;一旦重復了&#xff0c;可能會導致很嚴重的后果&#xff0c;例如交易的接口如果重復請求可能會重復下單。 重復的場…

Verilog基礎:$random系統函數的使用

相關閱讀 Verilog基礎?編輯https://blog.csdn.net/weixin_45791458/category_12263729.html $random系統函數語法的BNF范式如下所示&#xff0c;有關BNF范式相關內容&#xff0c;可以瀏覽以往文章Verilog基礎&#xff1a;巴科斯范式(BNF)。 $random系統函數在每次調用時返回一…

【IDEA】IntelliJ IDEA中進行Git版本控制

本篇文章主要記錄一下自己在IntelliJ IDEA上使用git的操作&#xff0c;一個新項目如何使用git進行版本控制。文章使用的IDEA版本 IntelliJ IDEA Community Edition 2023.3&#xff0c;遠程倉庫為https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Git…

[gRPC實現go調用go]

1什么是RPC RPC&#xff1a;Remote Procedure Call&#xff0c;遠程過程調用。簡單來說就是兩個進程之間的數據交互。正常服務端的接口服務是提供給用戶端(在Web開發中就是瀏覽器)或者自身調用的&#xff0c;也就是本地過程調用。和本地過程調用相對的就是&#xff1a;假如兩個…

深度優先遍歷(DFS)

時間復雜度與深搜一致&#xff1b;

STM32 定時器總結

縮寫 ARR: Auto-Reload Register&#xff08;保存定時器的計數范圍&#xff09; PSC: Prescaler register&#xff08;預分頻器寄存器&#xff0c;根據設置的分頻因子N&#xff0c;計數N個定時器時鐘脈沖后&#xff0c;產生一個CNT計數&#xff0c;以此實現分頻功能&#xff0…

LeetCode 2048. 下一個更大的數值平衡數

一、題目 1、題目描述 如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數。 0 < n < 1e6 2、接口描述 public:int nextB…

Android渲染-AHardwareBuffer

本文主要從應用的角度介紹android的native層AHardwareBuffer創建紋理以及保存渲染數據。 HardwareBuffer 要介紹native層的AHardwareBuffer&#xff0c;就需要先從Java層的HardwareBuffer說起。Android官方對于HardwareBuffer介紹如下&#xff1a; HardwareBuffer wraps a na…

HttpURLConnection OOM問題記錄

使用HttpURLConnection 上傳大文件&#xff0c;會出現內存溢出問題&#xff1a; 觀察HttpURLConnection 源碼&#xff1a; Overridepublic synchronized OutputStream getOutputStream() throws IOException {connecting true;SocketPermission p URLtoSocketPermission(th…

【接口分享】熱門好用的API,含免費次數

語音驗證碼短信&#xff1a;撥打電話告知用戶驗證碼&#xff0c;實現信息驗證。短信驗證碼&#xff1a;可用于登錄、注冊、找回密碼、支付認證等等應用場景。支持三大運營商&#xff0c;3秒可達&#xff0c;99.99&#xff05;到達率&#xff0c;支持大容量高并發。通知短信&…

基于SSM的點餐系統的設計與實現

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#xff1a;是 目錄…

mysql設置為密碼登錄

要設置Ubuntu上的MySQL需要密碼登錄&#xff0c;你可以使用以下步驟&#xff1a; 打開終端。 輸入以下命令登錄到 MySQL 服務器&#xff1a; sudo mysql -u root -p按Enter后&#xff0c;系統會要求輸入密碼。如果是第一次登錄&#xff0c;你可能需要直接按Enter鍵&#xff08…

【已解決】解決UbuntuKali無法進行SSH遠程連接

目錄 Ubuntu20.04配置SSH遠程連接Kali Linux配置SSH遠程連接 Ubuntu20.04配置SSH遠程連接 首先更新安裝包 sudo apt-get update 下載SSH服務 sudo apt install openssh-server 查看SSH服務 service ssh status 打開 /etc/ssh/sshd_config文件修改配置文件 將PermitRootLog…