日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

秒懂雙親委派機(jī)制

來(lái)源: 責(zé)編: 時(shí)間:2024-06-24 17:19:16 169觀看
導(dǎo)讀前言最近知識(shí)星球中,有位小伙伴問(wèn)了我一個(gè)問(wèn)題:JDBC為什么會(huì)破壞雙親委派機(jī)制?這個(gè)問(wèn)題挺有代表性的。雙親委派機(jī)制是Java中非常重要的類(lèi)加載機(jī)制,它保證了類(lèi)加載的完整性和安全性,避免了類(lèi)的重復(fù)加載。這篇文章就跟大家一

前言

最近知識(shí)星球中,有位小伙伴問(wèn)了我一個(gè)問(wèn)題:JDBC為什么會(huì)破壞雙親委派機(jī)制?sIo28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)問(wèn)題挺有代表性的。sIo28資訊網(wǎng)——每日最新資訊28at.com

雙親委派機(jī)制是Java中非常重要的類(lèi)加載機(jī)制,它保證了類(lèi)加載的完整性和安全性,避免了類(lèi)的重復(fù)加載。sIo28資訊網(wǎng)——每日最新資訊28at.com

這篇文章就跟大家一起聊聊,Java中類(lèi)加載的雙親委派機(jī)制到底是怎么回事,有哪些破壞雙親委派機(jī)制的案例,為什么要破壞雙親委派機(jī)制,希望對(duì)你會(huì)有所幫助。sIo28資訊網(wǎng)——每日最新資訊28at.com

1 為什么要雙親委派機(jī)制?

我們的Java在運(yùn)行之前,首先需要把Java代碼轉(zhuǎn)換成字節(jié)碼,即class文件。sIo28資訊網(wǎng)——每日最新資訊28at.com

然后JVM需要把字節(jié)碼通過(guò)一定的方式加載到內(nèi)存中的運(yùn)行時(shí)數(shù)據(jù)區(qū)。sIo28資訊網(wǎng)——每日最新資訊28at.com

這種方式就是類(lèi)加載器(ClassLoader)。sIo28資訊網(wǎng)——每日最新資訊28at.com

再通過(guò)加載、驗(yàn)證、準(zhǔn)備、解析、初始化這幾個(gè)步驟完成類(lèi)加載過(guò)程,然后再由jvm執(zhí)行引擎的解釋器和JIT即時(shí)編譯器去將字節(jié)碼指令轉(zhuǎn)換為本地機(jī)器指令進(jìn)行執(zhí)行。sIo28資訊網(wǎng)——每日最新資訊28at.com

我們?cè)谑褂妙?lèi)加載器加載類(lèi)的時(shí)候,會(huì)面臨下面幾個(gè)問(wèn)題:sIo28資訊網(wǎng)——每日最新資訊28at.com

  • 如何保證類(lèi)不會(huì)被重復(fù)加載?類(lèi)重復(fù)加載會(huì)出現(xiàn)很多問(wèn)題。
  • 類(lèi)加載器是否允許用戶自定義?
  • 如果允許用戶自定義,如何保證類(lèi)文件的安全性?
  • 如何保證加載的類(lèi)的完整性?

為了解決上面的這一系列的問(wèn)題,我們必須要引入某一套機(jī)制,這套機(jī)制就是:雙親委派機(jī)制。sIo28資訊網(wǎng)——每日最新資訊28at.com

2 什么是雙親委派機(jī)制?

接下來(lái),我們看看什么是雙親委派機(jī)制。sIo28資訊網(wǎng)——每日最新資訊28at.com

雙親委派機(jī)制的基本思想是:當(dāng)一個(gè)類(lèi)加載器試圖加載某個(gè)類(lèi)時(shí),它會(huì)先委托給其父類(lèi)加載器,如果父類(lèi)加載器無(wú)法加載,再由當(dāng)前類(lèi)加載器自己進(jìn)行加載。sIo28資訊網(wǎng)——每日最新資訊28at.com

這種層層委派的方式有助于保障類(lèi)的唯一性,避免類(lèi)的重復(fù)加載,并提高系統(tǒng)的安全性和穩(wěn)定性。sIo28資訊網(wǎng)——每日最新資訊28at.com

在Java中默認(rèn)的類(lèi)加載器有3層:sIo28資訊網(wǎng)——每日最新資訊28at.com

  1. 啟動(dòng)類(lèi)加載器(Bootstrap Class Loader):負(fù)責(zé)加載 %JAVA_HOME%/jre/lib 目錄下的核心Java類(lèi)庫(kù),比如:rt.jar、charsets.jar等。它是最頂層的類(lèi)加載器,通常由C++編寫(xiě)。
  2. 擴(kuò)展類(lèi)加載器(Extension Class Loader):負(fù)責(zé)加載Java的擴(kuò)展庫(kù),一般位于<JAVA_HOME>/lib/ext目錄下。
  3. 應(yīng)用程序類(lèi)加載器(Application Class Loader):也稱為系統(tǒng)類(lèi)加載器,負(fù)責(zé)加載用戶類(lèi)路徑(ClassPath)下的應(yīng)用程序類(lèi)。

用一張圖梳理一下,雙親委派機(jī)制中的3種類(lèi)加載器的層次關(guān)系:sIo28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片sIo28資訊網(wǎng)——每日最新資訊28at.com

但這樣不夠靈活,用戶沒(méi)法控制,加載自己想要的一些類(lèi)。sIo28資訊網(wǎng)——每日最新資訊28at.com

于是,Java中引入了自定義類(lèi)加載器。sIo28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建一個(gè)新的類(lèi)并繼承ClassLoader類(lèi),然后重寫(xiě)findClass方法。sIo28資訊網(wǎng)——每日最新資訊28at.com

該方法主要是實(shí)現(xiàn)從那個(gè)路徑讀取 ar包或者.class文件,將讀取到的文件用字節(jié)數(shù)組來(lái)存儲(chǔ),然后可以使用父類(lèi)的defineClass來(lái)轉(zhuǎn)換成字節(jié)碼。sIo28資訊網(wǎng)——每日最新資訊28at.com

如果想破壞雙親委派的話,就重寫(xiě)loadClass方法,否則不用重寫(xiě)。sIo28資訊網(wǎng)——每日最新資訊28at.com

類(lèi)加載器的層次關(guān)系改成:sIo28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片sIo28資訊網(wǎng)——每日最新資訊28at.com

雙親委派機(jī)制流程圖如下:sIo28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片sIo28資訊網(wǎng)——每日最新資訊28at.com

具體流程大概是這樣的:sIo28資訊網(wǎng)——每日最新資訊28at.com

  • 需要加載某個(gè)類(lèi)時(shí),先檢查自定義類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
  • 如果自定義類(lèi)加載器沒(méi)有加載過(guò),則檢查應(yīng)用程序類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
  • 如果應(yīng)用程序類(lèi)加載器沒(méi)有加載過(guò),則檢查擴(kuò)展類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
  • 如果擴(kuò)展類(lèi)加載器沒(méi)有加載過(guò),則檢查啟動(dòng)類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
  • 如果啟動(dòng)類(lèi)加載器沒(méi)有加載過(guò),則判斷當(dāng)前類(lèi)加載器能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
  • 如果啟動(dòng)類(lèi)加載器不能加載該類(lèi),則交給擴(kuò)展類(lèi)加載器。擴(kuò)展類(lèi)加載器判斷能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
  • 如果擴(kuò)展類(lèi)加載器不能加載該類(lèi),則交給應(yīng)用程序類(lèi)加載器。應(yīng)用程序類(lèi)加載器判斷能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
  • 如果應(yīng)用程序類(lèi)加載器不能加載該類(lèi),則交給自定義類(lèi)加載器。自定義類(lèi)加載器判斷能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
  • 如果自定義類(lèi)加載器,也無(wú)法加載這個(gè)類(lèi),則直接拋ClassNotFoundException異常。

這樣做的好處是:sIo28資訊網(wǎng)——每日最新資訊28at.com

  • 保證類(lèi)不會(huì)重復(fù)加載。加載類(lèi)的過(guò)程中,會(huì)向上問(wèn)一下是否加載過(guò),如果已經(jīng)加載了,則不會(huì)再加載,這樣可以保證一個(gè)類(lèi)只會(huì)被加載一次。
  • 保證類(lèi)的安全性。核心的類(lèi)已經(jīng)被啟動(dòng)類(lèi)加載器加載了,后面即使有人篡改了該類(lèi),也不會(huì)再加載了,防止了一些有危害的代碼的植入。

3 破壞雙親委派機(jī)制的場(chǎng)景

既然Java中引入了雙親委派機(jī)制,為什么要破壞它呢?sIo28資訊網(wǎng)——每日最新資訊28at.com

答:因?yàn)樗幸恍┤秉c(diǎn)。sIo28資訊網(wǎng)——每日最新資訊28at.com

下面給大家列舉一下,破壞雙親委派機(jī)制最常見(jiàn)的場(chǎng)景。sIo28資訊網(wǎng)——每日最新資訊28at.com

3.1 JNDI

JNDI是Java中的標(biāo)準(zhǔn)服務(wù),它的代碼由啟動(dòng)類(lèi)加載器去加載。sIo28資訊網(wǎng)——每日最新資訊28at.com

但JNDI要對(duì)資源進(jìn)行集中管理和查找,它需要調(diào)用由獨(dú)立廠商在應(yīng)用程序的ClassPath下的實(shí)現(xiàn)了JNDI接口的代碼,但啟動(dòng)類(lèi)加載器不可能“認(rèn)識(shí)”這些外部代碼。sIo28資訊網(wǎng)——每日最新資訊28at.com

為了解決這個(gè)問(wèn)題,Java后來(lái)引入了線程上下文類(lèi)加載器(Thread Context ClassLoader)。sIo28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)類(lèi)加載器可以通過(guò)java.lang.Thread類(lèi)的setContextClassLoader()方法進(jìn)行設(shè)置。sIo28資訊網(wǎng)——每日最新資訊28at.com

如果創(chuàng)建線程時(shí)沒(méi)有設(shè)置,他將會(huì)從父線程中繼承一個(gè),如果在應(yīng)用程序的全局范圍內(nèi)都沒(méi)有設(shè)置過(guò)的話,那這個(gè)類(lèi)加載器默認(rèn)就是應(yīng)用程序類(lèi)加載器。sIo28資訊網(wǎng)——每日最新資訊28at.com

有了線程上下文加載器,JNDI服務(wù)就可以使用它去加載所需要的SPI代碼,也就是父類(lèi)加載器請(qǐng)求子類(lèi)加載器去完成類(lèi)加載的動(dòng)作,這樣就打破了雙親委派機(jī)制。sIo28資訊網(wǎng)——每日最新資訊28at.com

3.2 JDBC

原生的JDBC中Driver驅(qū)動(dòng)本身只是一個(gè)接口,并沒(méi)有具體的實(shí)現(xiàn),具體的實(shí)現(xiàn)是由不同數(shù)據(jù)庫(kù)類(lèi)型去實(shí)現(xiàn)的。sIo28資訊網(wǎng)——每日最新資訊28at.com

例如,MySQL的mysql-connector.jar中的Driver類(lèi)具體實(shí)現(xiàn)的。sIo28資訊網(wǎng)——每日最新資訊28at.com

原生的JDBC中的類(lèi)是放在rt.jar包,是由啟動(dòng)類(lèi)加載器進(jìn)行類(lèi)加載的。sIo28資訊網(wǎng)——每日最新資訊28at.com

在JDBC中需要?jiǎng)討B(tài)去加載不同數(shù)據(jù)庫(kù)類(lèi)型的Driver實(shí)現(xiàn)類(lèi),而mysql-connector.jar中的Driver實(shí)現(xiàn)類(lèi)是用戶自己寫(xiě)的代碼,啟動(dòng)類(lèi)加載器肯定是不能加載的,那就需要由應(yīng)用程序啟動(dòng)類(lèi)去進(jìn)行類(lèi)加載。sIo28資訊網(wǎng)——每日最新資訊28at.com

為了解決這個(gè)問(wèn)題,也可以使用線程上下文類(lèi)加載器(Thread Context ClassLoader)。sIo28資訊網(wǎng)——每日最新資訊28at.com

3.3  Tomcat容器

Tomcat是Servlet容器,它負(fù)責(zé)加載Servlet相關(guān)的jar包。sIo28資訊網(wǎng)——每日最新資訊28at.com

此外,Tomcat本身也是Java程序,也需要加載自身的類(lèi)和一些依賴jar包。sIo28資訊網(wǎng)——每日最新資訊28at.com

這樣就會(huì)帶來(lái)下面的問(wèn)題:sIo28資訊網(wǎng)——每日最新資訊28at.com

  1. 一個(gè)Tomcat容器下面,可以部署多個(gè)基于Servlet的Web應(yīng)用,但如果這些Web應(yīng)用下有同名的Servlet類(lèi),又不能產(chǎn)生沖突,需要相互獨(dú)立加載和運(yùn)行才行。
  2. 但如果多個(gè)Web應(yīng)用,使用了相同的依賴,比如:SpringBoot、Mybatis等。這些依賴包所涉及的文件非常多,如果全部都獨(dú)立,可能會(huì)導(dǎo)致JVM內(nèi)存不足。也就是說(shuō),有些公共的依賴包,最好能夠只加載一次。
  3. 我們還需要將Tomcat本身的類(lèi),跟Web應(yīng)用的類(lèi)隔離開(kāi)。

這些原因?qū)е拢琓omcat沒(méi)有辦法使用傳統(tǒng)的雙親委派機(jī)制加載類(lèi)了。sIo28資訊網(wǎng)——每日最新資訊28at.com

那么,Tomcat加載類(lèi)的機(jī)制是怎么樣的?sIo28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片sIo28資訊網(wǎng)——每日最新資訊28at.com

  • CommonClassLoader:是Tomcat最基本的類(lèi)加載器,它加載的類(lèi)可以被Tomcat容器和Web應(yīng)用訪問(wèn)。
  • CatalinaClassLoader:是Tomcat容器私有的類(lèi)加載器,加載類(lèi)對(duì)于Web應(yīng)用不可見(jiàn)。
  • SharedClassLoader:各個(gè)Web應(yīng)用共享的類(lèi)加載器,加載的類(lèi)對(duì)于所有Web應(yīng)用可見(jiàn),但是對(duì)于Tomcat容器不可見(jiàn)。
  • WebAppClassLoader:各個(gè)Web應(yīng)用私有的類(lèi)加載器,加載類(lèi)只對(duì)當(dāng)前Web應(yīng)用可見(jiàn)。比如不同war包應(yīng)用引入了不同的Spring版本,這樣能加載各自的Spring版本,相互隔離。

sIo28資訊網(wǎng)——每日最新資訊28at.com

3.4 熱部署

由于用戶對(duì)程序動(dòng)態(tài)性的追求,比如:代碼熱部署、代碼熱替換等功能,引入了OSGi(Open Service Gateway Initiative)。sIo28資訊網(wǎng)——每日最新資訊28at.com

OSGi中的每一個(gè)模塊(稱為Bundle)。sIo28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)程序升級(jí)或者更新時(shí),可以只停用、重新安裝然后啟動(dòng)程序的其中一部分,對(duì)企業(yè)來(lái)說(shuō)這是一個(gè)非常誘人的功能。sIo28資訊網(wǎng)——每日最新資訊28at.com

OSGi的Bundle類(lèi)加載器之間只有規(guī)則,沒(méi)有固定的委派關(guān)系。sIo28資訊網(wǎng)——每日最新資訊28at.com

各個(gè)Bundle加載器是平級(jí)關(guān)系。sIo28資訊網(wǎng)——每日最新資訊28at.com

不是雙親委派關(guān)系。sIo28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-96058-0.html秒懂雙親委派機(jī)制

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 深入解析復(fù)雜SQL查詢及其在C#中的應(yīng)用

下一篇: 有沒(méi)有并發(fā)編程經(jīng)驗(yàn),一問(wèn)這個(gè)類(lèi)便知!

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 石頭智能洗地機(jī)A10 Plus體驗(yàn):雙向自清潔治好了我的懶癌

    一、前言和介紹專(zhuān)為家庭請(qǐng)假懶人而生的石頭科技在近日又帶來(lái)了自己的全新旗艦新品,石頭智能洗地機(jī)A10 Plus。從這個(gè)產(chǎn)品名上就不難看出,這次石頭推出的并不是常見(jiàn)的掃地機(jī)器
  • 5月iOS設(shè)備好評(píng)榜:iPhone 14僅排第43?

    來(lái)到新的一月,安兔兔的各個(gè)榜單又重新匯總了數(shù)據(jù),像安卓陣營(yíng)的榜單都有著比較大的變動(dòng),不過(guò)iOS由于設(shè)備的更新?lián)Q代并沒(méi)有那么快,所以相對(duì)來(lái)說(shuō)變化并不大,特別是iOS好評(píng)榜,老款設(shè)
  • 《英雄聯(lián)盟》夏季賽總決賽今日開(kāi)打!JDG對(duì)陣LNG首發(fā)名單來(lái)了 Knight:準(zhǔn)備三連冠

    8月5日消息,今日17:00,《英雄聯(lián)盟》2023LPL夏季賽總決賽將正式開(kāi)打,由JDG對(duì)陣LNG。對(duì)兩支隊(duì)伍來(lái)說(shuō),這場(chǎng)比賽不僅要爭(zhēng)奪夏季賽冠軍,更要決定誰(shuí)才是LPL賽區(qū)一
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒(méi)有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請(qǐng)果斷劃走,對(duì)你沒(méi)啥幫助~主人公這篇文章內(nèi)容來(lái)自 「升職加薪」星球星友 的投稿,坐
  • 零售大模型“干中學(xué)”,攀爬數(shù)字化珠峰

    文/侯煜編輯/cc來(lái)源/華爾街科技眼對(duì)于絕大多數(shù)登山愛(ài)好者而言,攀爬珠穆朗瑪峰可謂終極目標(biāo)。攀登珠峰的商業(yè)路線有兩條,一是尼泊爾境內(nèi)的南坡路線,一是中國(guó)境內(nèi)的北坡路線。相
  • 2023年,我眼中的字節(jié)跳動(dòng)

    此時(shí)此刻(2023年7月),字節(jié)跳動(dòng)從未上市,也從未公布過(guò)任何官方的上市計(jì)劃;但是這并不妨礙它成為中國(guó)最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢(shì)崛起,到2018年的&ldquo;頭騰
  • ESG的面子與里子

    來(lái)源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是&ldquo;環(huán)境保
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創(chuàng) 作者|程心 羅輯2023年之前,對(duì)于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新業(yè)務(wù)到 2022 年底還是 0,希望 2023 年出來(lái)一個(gè) 1。&rdquo;這是2022年底,李彥宏
  • 華為發(fā)布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開(kāi)發(fā)者大會(huì)2023(HDC.Together)大會(huì)上,HarmonyOS 4正式發(fā)布。自2019年發(fā)布以來(lái),HarmonyOS一直以用戶為中心,經(jīng)歷四年多的發(fā)展HarmonyOS已
Top 主站蜘蛛池模板: 满城县| 道孚县| 白沙| 蛟河市| 略阳县| 女性| 榆社县| 常宁市| 武城县| 盱眙县| 麦盖提县| 榆中县| 革吉县| 威海市| 承德县| 商河县| 房产| 云梦县| 江川县| 揭阳市| 巴里| 扶余县| 西华县| 庆城县| 肇东市| 利津县| 宁南县| 叶城县| 和林格尔县| 高要市| 出国| 丹凤县| 华容县| 宜黄县| 常山县| 鄱阳县| 石泉县| 襄城县| 孟村| 疏勒县| 锡林浩特市|