未能成功加載擴展程序_【JAVA虛擬機(JVM)精髓】09-幾種不同的類加載器

持續更新JVM相關知識,敬請關注:

Java虛擬機精髓專欄?zhuanlan.zhihu.com
99e45f2ac58ce10ee89c3442888d8c14.png


上一節說了下類加載器和類加載過程。這一節我們看下幾種不同的類加載器。

JVM支持的類加載器有兩類,分別是引導類加載器和自定義加載器。這里的自定義自定義加載器,不僅僅指用戶自己實現的加載器,而是泛指所有繼承ClassLoader這個抽象類的加載器。

作為JAVA程序員,起碼要知道引導加載器、擴展加載器、系統加載器這三種,除此之外,還有很多用戶自定義加載器,他們的分類關系見下圖。

ed07e7823d8b038e83d0e0c95f11377b.png

JAVA內部實際的繼承關系如何呢?大家可以查看下Laucher類,會發現其中有兩個內部類,ExtClassLoader和AppClassLoader,這兩個就是擴展類加載器和系統類加載器。他們都繼承自URLClassLoader,URLClassLoader再繼承自SecureClassLoader,最終繼承ClassLoader。下面我們來看一個代碼實例:

317478a0f93da4650f014bfb82191e06.png

首先我們通過ClassLoader提供的方法直接獲取系統類加載器,會發現是AppClassLoader,然后我們再通過getParent方法,獲取上層擴展類加載器,發現是ExtClassLoader,之后我們再想getParent獲取引導類加載器,發現獲取不到了,輸出了null。

下面我們通過當前類的類對象,獲取他的ClassLoader,輸出的是AppClassLoader,說明當前類是由系統類加載器加載的,并且大家注意,這個系統類加載器同之前那個內存地址是一致的,有此可見,這個系統類加載器只會被加載一次。

最后我們再看下String類的加載器,發現輸出的是null,這就說明了,String加載器是通過引導類加載器加載的。系統的核心類庫,都是使用引導類加載的。

下面我們來具體說下這幾種不同的加載器:

1、引導類加載器(Bootstrap ClassLoader)

引導類加載器是由C和C++語言實現的,集成在JVM內部,所有JAVA的核心類庫(rt.jar、resources.jar、sun.boot.class.path等)通過它來加載的。引導類加載器不繼承java.lang.ClassLoader也沒有上層加載器。他是擴展類加載器和應用類加載器的父類。Java由于安全方面的考慮,引導類加載器,只能加載java、javax、sun為開頭的java自身的類庫。

我們通過代碼雖然獲取不到引導類加載器,但是我們可以查看下可以加載哪些類庫:

import 

可以看到輸出結果如下:

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/resources.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/rt.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/sunrsasign.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/jsse.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/jce.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/charsets.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/jfr.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/classes

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

擴展類加載器,是JVM內部自帶的加載器,Java語言編寫,對應sun.misc.Launcher$ExtClassLoader這個內部類。間接繼承自ClassLoader類,他是通過引導類加載器進行加載的。擴展類加載器負責加載java.ext.dirs所指定目錄或jre/libb/ext中的類庫,我們自己定義的jar放到這些路徑下,就會被擴展類加載器所加載。

3、系統類加載器(System ClassLoader)

系統類加載器,也叫做應用程序加載器,也是由JAVA語言編寫的,對應sun.misc.Launcher$AppClassLoader這個內部類。同樣間接繼承ClassLoader類,它是通過擴展類加載器加載的。系統類加載器負責加載classpath路徑下或java.class.path屬性下的指定的了類庫。實際上,系統類加載器是程序中的默認加載器,我們平常所編寫的絕大不部分類,默認都是由這個加載器所加載的。這個可以看上面的代碼演示結果。代碼中,我們可以通過ClassLoader提供的getSystemClassLoader()方法獲得到這個類加載器的實例。

4、用戶自定義類加載器(User Defined ClassLoader)

在某些場合下,我們使用上述三種類加載器,無法滿足我們的使用需求,這是就需要由我們自己去自定義一些類加載器,當然,這個在一般應用場景下會比較少用,所以在這不做過多講解,之后再去詳細說。用戶可以通過繼承ClassLoader,jdk1.2以后,可以重寫findClass方法來實現自定義,這里主要編寫的邏輯是加載對應路徑的類的二進制數組,然后調用defineClass()方法去生成傳入字節數組所代表類的實例。這里面對二進制數組的特殊操作,就可以根據需求去做更改了。如果需求更加簡潔,也可以直接繼承URLClassLoader來實現。

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

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

相關文章

Oracle .事物,提交,回滾

事物(transaction) -->作為單個邏輯工作單元執行的一系列操作(要么全部成功要么全部失敗) 提交(commit) -->系列操作全部成功的場合才會執行 回滾(rollback) -->系列操作其…

perl 哈希數組的哈希_第一個元素使用哈希在數組中出現K次

perl 哈希數組的哈希Prerequisite: Hashing data structure 先決條件: 哈希數據結構 Problem statement: 問題陳述: Find the first element occurring K times in the array. 查找數組中出現K次的第一個元素。 Example: 例: Input array…

圖片md5修改工具_如何修改視頻和圖片的MD5,用電腦自帶的命令

首先說下,md5到底是啥,它是一段固定長度的數據。無論原始數據是多長或多短,其MD5值都是128bit。另外md5是確定性,一個原始數據的MD5值是唯一的,同一個原始數據不可能會計算出多個不同的MD5值;類似人類的身份…

iOS - UISearchController

前言 NS_CLASS_DEPRECATED_IOS(3_0, 8_0, "UISearchDisplayController has been replaced with UISearchController")interface UISearchDisplayController : NSObjectavailable(iOS, introduced3.0, deprecated8.0, message"UISearchDisplayController has bee…

浮點數轉換為整數四舍五入_定義宏以將浮點值四舍五入為C中最接近的整數

浮點數轉換為整數四舍五入Given a float value and we have to round the value to the nearest integer with the help of Macro in C language. 給定一個浮點值,我們必須借助C語言中的Macro將其舍入到最接近的整數。 Macro Definition: 宏定義: #def…

c語言遍歷文件內容_C語言學習第28篇---動態內存分配剖析

為什么C語言要動態分配內存的意義?1.C語言中的一切操作都是基于內存的2.變量和數組都是內存的別名---內存分配由編譯器在編譯期間決定的---定義數組的時候必須指定數組長度---數組長度是在編譯期就必須確定的需求:程序運行的過程中,可能需要使…

重啟mysql的命令 linux_linux重啟mysql命令

如何啟動/停止/重啟MySQL一、 啟動方式1、使用 service 啟動:service mysqld start2、使用 mysqld 腳本啟動:/etc/inint.d/mysqld start3、使用 safe_mysqld 啟動:safe_mysqld&二、停止1、使用 service 啟動:service mysqld s…

tomcat 多項目多HOST配置

一、場景&#xff1a;使用一個tomcat部署多個項目&#xff0c;并且分別使用不同域名進行訪問。二、詳細配置tomcat/conf/server.xml 中寫<Engine name"Catalina" defaultHost"localhost">***********************************<Host name"biz…

javascript原型_使用JavaScript的示例報告卡Web應用程序原型

javascript原型Hi! At times, beginners always find it hard getting the application of the theory they learn In programming or a particular language. 嗨&#xff01; 有時&#xff0c;初學者總是很??難在編程或特定語言中應用他們學到的理論。 In this article, we…

vb.net cad 塊表最后的實體_21個繪圖命令+7個技巧,3分鐘讓你成為CAD高手

繪制圖紙需要用到CAD&#xff0c;CAD制圖在生活中也是廣泛運用&#xff0c;那么學習CAD到底難不難呢&#xff1f;在這里要告訴CAD新手們&#xff0c;世上無難事&#xff0c;可以用3分鐘讓你成為CAD高手。21個繪圖命令A&#xff1a;繪圓弧B&#xff1a;定義塊C&#xff1a;畫圓D…

本地tomcat啟動war包_「shell腳本」懶人運維之自動升級tomcat應用(war包)

準備&#xff1a;提前修改war包里的相關配置&#xff0c;并上傳到服務器&#xff1b;根據要自動升級的tomcat應用修改或添加腳本相關內容&#xff1b;tomcat啟動腳本如是自己寫的&#xff0c;要統一格式命名&#xff0c;如&#xff1a;xxx、xxxTomcat 等&#xff1b;拿到生產使…

python將txt轉為字符串_python做第一只小爬蟲

“受盡苦難而不厭&#xff0c;此乃修羅之路”本文技術含量過低&#xff0c;請謹慎觀看之前用R語言的Rcurl包做過爬蟲&#xff0c;給自己的第一感覺是比較費勁&#xff0c;看著看著發際線就愈加亮眼&#xff0c;最后果斷丟之。不過好的是和python爬取原理基本一致&#xff0c;且…

c#查找列表指定元素的索引_在集合的指定索引處插入元素 在C#中

c#查找列表指定元素的索引Given a Collection<T> of Integer and we have to insert an element at given index. 給定Integer的Collection <T>&#xff0c;我們必須在給定的索引處插入一個元素。 To insert an element in Collection<T>, we use Insert() …

跨域技術(JSONP與CROS)

JSONP 我們發現&#xff0c;Web頁面上調用js文件時不受是否跨域的影響&#xff0c;凡是擁有"src"這個屬性的標簽都擁有跨域的能力&#xff0c;比如<script>、<img>、<iframe>。那就是說如果要跨域訪問數據&#xff0c;就服務端只能把數據放在js格式…

python3 array為什么不能放不同類型的數據_小白入門Python數據科學全教程lt;一gt;...

前言本文講解了從零開始學習Python數據科學的全過程&#xff0c;涵蓋各種工具和方法你將會學習到如何使用python做基本的數據分析你還可以了解機器學習算法的原理和使用說明先說一段題外話。我是一名數據科學家&#xff0c;在用SAS做分析超過5年后&#xff0c;我決定走出舒適區…

c winform 上傳文件到mysql_C# winform DevExpress上傳圖片到數據庫【轉】

實現功能如下圖&#xff1a;注明&#xff1a;此文使用的是DevExpress控件&#xff0c;winform 原生控件也是一樣使用方法。1.點擊選擇圖片按鈕&#xff0c;功能為通過對話框選擇要上傳的文件&#xff0c;并將該文件在下面的PictureEdit中顯示出來。具體代碼如下&#xff1a;pri…

V 8 nfs+drbd+heartbeat

V 8 nfsdrbdheartbeatnfsdrbdheartbeat&#xff0c;nfs或分布式存儲mfs只要有單點都可用此方案解決在企業實際生產場景中&#xff0c;nfs是中小企業最常用的存儲架構解決方案之一&#xff0c;該架構方案部署簡單、維護方便&#xff0c;只需通過配inotifyrsync簡單而高效的數據同…

nodemailer使用_如何使用Nodemailer使用HTML作為內容發送電子郵件 Node.js

nodemailer使用Prerequisite: 先決條件&#xff1a; How to send emails using Nodemailer | Node.js 如何使用Nodemailer發送電子郵件。 Node.js How to send emails with attachments using Nodemailer | Node.js 如何使用Nodemailer發送帶有附件的電子郵件。 Node.js This …

angularjs 元素重復指定次數_[LeetCode] 442. 數組中重復的數據

[LeetCode] 442. 數組中重復的數據題目鏈接&#xff1a; https://leetcode-cn.com/problems/find-all-duplicates-in-an-array難度&#xff1a;中等通過率&#xff1a;61.5%題目描述:給定一個整數數組 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08; n 為數組長度&#xff09;,…

docker 安裝mysql 實戰文檔_docker 安裝mysql

PassJava (佳必過) 項目全套學習教程連載中&#xff0c;關注公眾號第一時間獲取。docker 安裝mysql1.下載鏡像sudo docker pull mysql:5.7ubuntuVM-0-13-ubuntu:~$ sudo docker pull mysql:5.75.7: Pulling from library/mysqlc499e6d256d6: Pull complete22c4cdf4ea75: Pull c…