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

當前位置:首頁 > 科技  > 軟件

秒懂雙親委派機制

來源: 責編: 時間:2024-06-24 17:19:16 241觀看
導讀前言最近知識星球中,有位小伙伴問了我一個問題:JDBC為什么會破壞雙親委派機制?這個問題挺有代表性的。雙親委派機制是Java中非常重要的類加載機制,它保證了類加載的完整性和安全性,避免了類的重復加載。這篇文章就跟大家一

前言

最近知識星球中,有位小伙伴問了我一個問題:JDBC為什么會破壞雙親委派機制?OSS28資訊網——每日最新資訊28at.com

這個問題挺有代表性的。OSS28資訊網——每日最新資訊28at.com

雙親委派機制是Java中非常重要的類加載機制,它保證了類加載的完整性和安全性,避免了類的重復加載。OSS28資訊網——每日最新資訊28at.com

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

1 為什么要雙親委派機制?

我們的Java在運行之前,首先需要把Java代碼轉換成字節碼,即class文件。OSS28資訊網——每日最新資訊28at.com

然后JVM需要把字節碼通過一定的方式加載到內存中的運行時數據區。OSS28資訊網——每日最新資訊28at.com

這種方式就是類加載器(ClassLoader)。OSS28資訊網——每日最新資訊28at.com

再通過加載、驗證、準備、解析、初始化這幾個步驟完成類加載過程,然后再由jvm執行引擎的解釋器和JIT即時編譯器去將字節碼指令轉換為本地機器指令進行執行。OSS28資訊網——每日最新資訊28at.com

我們在使用類加載器加載類的時候,會面臨下面幾個問題:OSS28資訊網——每日最新資訊28at.com

  • 如何保證類不會被重復加載?類重復加載會出現很多問題。
  • 類加載器是否允許用戶自定義?
  • 如果允許用戶自定義,如何保證類文件的安全性?
  • 如何保證加載的類的完整性?

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

2 什么是雙親委派機制?

接下來,我們看看什么是雙親委派機制。OSS28資訊網——每日最新資訊28at.com

雙親委派機制的基本思想是:當一個類加載器試圖加載某個類時,它會先委托給其父類加載器,如果父類加載器無法加載,再由當前類加載器自己進行加載。OSS28資訊網——每日最新資訊28at.com

這種層層委派的方式有助于保障類的唯一性,避免類的重復加載,并提高系統的安全性和穩定性。OSS28資訊網——每日最新資訊28at.com

在Java中默認的類加載器有3層:OSS28資訊網——每日最新資訊28at.com

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

用一張圖梳理一下,雙親委派機制中的3種類加載器的層次關系:OSS28資訊網——每日最新資訊28at.com

圖片圖片OSS28資訊網——每日最新資訊28at.com

但這樣不夠靈活,用戶沒法控制,加載自己想要的一些類。OSS28資訊網——每日最新資訊28at.com

于是,Java中引入了自定義類加載器。OSS28資訊網——每日最新資訊28at.com

創建一個新的類并繼承ClassLoader類,然后重寫findClass方法。OSS28資訊網——每日最新資訊28at.com

該方法主要是實現從那個路徑讀取 ar包或者.class文件,將讀取到的文件用字節數組來存儲,然后可以使用父類的defineClass來轉換成字節碼。OSS28資訊網——每日最新資訊28at.com

如果想破壞雙親委派的話,就重寫loadClass方法,否則不用重寫。OSS28資訊網——每日最新資訊28at.com

類加載器的層次關系改成:OSS28資訊網——每日最新資訊28at.com

圖片圖片OSS28資訊網——每日最新資訊28at.com

雙親委派機制流程圖如下:OSS28資訊網——每日最新資訊28at.com

圖片圖片OSS28資訊網——每日最新資訊28at.com

具體流程大概是這樣的:OSS28資訊網——每日最新資訊28at.com

  • 需要加載某個類時,先檢查自定義類加載器是否加載過,如果已經加載過,則直接返回。
  • 如果自定義類加載器沒有加載過,則檢查應用程序類加載器是否加載過,如果已經加載過,則直接返回。
  • 如果應用程序類加載器沒有加載過,則檢查擴展類加載器是否加載過,如果已經加載過,則直接返回。
  • 如果擴展類加載器沒有加載過,則檢查啟動類加載器是否加載過,如果已經加載過,則直接返回。
  • 如果啟動類加載器沒有加載過,則判斷當前類加載器能否加載這個類,如果能加載,則加載該類,然后返回。
  • 如果啟動類加載器不能加載該類,則交給擴展類加載器。擴展類加載器判斷能否加載這個類,如果能加載,則加載該類,然后返回。
  • 如果擴展類加載器不能加載該類,則交給應用程序類加載器。應用程序類加載器判斷能否加載這個類,如果能加載,則加載該類,然后返回。
  • 如果應用程序類加載器不能加載該類,則交給自定義類加載器。自定義類加載器判斷能否加載這個類,如果能加載,則加載該類,然后返回。
  • 如果自定義類加載器,也無法加載這個類,則直接拋ClassNotFoundException異常。

這樣做的好處是:OSS28資訊網——每日最新資訊28at.com

  • 保證類不會重復加載。加載類的過程中,會向上問一下是否加載過,如果已經加載了,則不會再加載,這樣可以保證一個類只會被加載一次。
  • 保證類的安全性。核心的類已經被啟動類加載器加載了,后面即使有人篡改了該類,也不會再加載了,防止了一些有危害的代碼的植入。

3 破壞雙親委派機制的場景

既然Java中引入了雙親委派機制,為什么要破壞它呢?OSS28資訊網——每日最新資訊28at.com

答:因為它有一些缺點。OSS28資訊網——每日最新資訊28at.com

下面給大家列舉一下,破壞雙親委派機制最常見的場景。OSS28資訊網——每日最新資訊28at.com

3.1 JNDI

JNDI是Java中的標準服務,它的代碼由啟動類加載器去加載。OSS28資訊網——每日最新資訊28at.com

但JNDI要對資源進行集中管理和查找,它需要調用由獨立廠商在應用程序的ClassPath下的實現了JNDI接口的代碼,但啟動類加載器不可能“認識”這些外部代碼。OSS28資訊網——每日最新資訊28at.com

為了解決這個問題,Java后來引入了線程上下文類加載器(Thread Context ClassLoader)。OSS28資訊網——每日最新資訊28at.com

這個類加載器可以通過java.lang.Thread類的setContextClassLoader()方法進行設置。OSS28資訊網——每日最新資訊28at.com

如果創建線程時沒有設置,他將會從父線程中繼承一個,如果在應用程序的全局范圍內都沒有設置過的話,那這個類加載器默認就是應用程序類加載器。OSS28資訊網——每日最新資訊28at.com

有了線程上下文加載器,JNDI服務就可以使用它去加載所需要的SPI代碼,也就是父類加載器請求子類加載器去完成類加載的動作,這樣就打破了雙親委派機制。OSS28資訊網——每日最新資訊28at.com

3.2 JDBC

原生的JDBC中Driver驅動本身只是一個接口,并沒有具體的實現,具體的實現是由不同數據庫類型去實現的。OSS28資訊網——每日最新資訊28at.com

例如,MySQL的mysql-connector.jar中的Driver類具體實現的。OSS28資訊網——每日最新資訊28at.com

原生的JDBC中的類是放在rt.jar包,是由啟動類加載器進行類加載的。OSS28資訊網——每日最新資訊28at.com

在JDBC中需要動態去加載不同數據庫類型的Driver實現類,而mysql-connector.jar中的Driver實現類是用戶自己寫的代碼,啟動類加載器肯定是不能加載的,那就需要由應用程序啟動類去進行類加載。OSS28資訊網——每日最新資訊28at.com

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

3.3  Tomcat容器

Tomcat是Servlet容器,它負責加載Servlet相關的jar包。OSS28資訊網——每日最新資訊28at.com

此外,Tomcat本身也是Java程序,也需要加載自身的類和一些依賴jar包。OSS28資訊網——每日最新資訊28at.com

這樣就會帶來下面的問題:OSS28資訊網——每日最新資訊28at.com

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

這些原因導致,Tomcat沒有辦法使用傳統的雙親委派機制加載類了。OSS28資訊網——每日最新資訊28at.com

那么,Tomcat加載類的機制是怎么樣的?OSS28資訊網——每日最新資訊28at.com

圖片圖片OSS28資訊網——每日最新資訊28at.com

  • CommonClassLoader:是Tomcat最基本的類加載器,它加載的類可以被Tomcat容器和Web應用訪問。
  • CatalinaClassLoader:是Tomcat容器私有的類加載器,加載類對于Web應用不可見。
  • SharedClassLoader:各個Web應用共享的類加載器,加載的類對于所有Web應用可見,但是對于Tomcat容器不可見。
  • WebAppClassLoader:各個Web應用私有的類加載器,加載類只對當前Web應用可見。比如不同war包應用引入了不同的Spring版本,這樣能加載各自的Spring版本,相互隔離。

OSS28資訊網——每日最新資訊28at.com

3.4 熱部署

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

OSGi中的每一個模塊(稱為Bundle)。OSS28資訊網——每日最新資訊28at.com

當程序升級或者更新時,可以只停用、重新安裝然后啟動程序的其中一部分,對企業來說這是一個非常誘人的功能。OSS28資訊網——每日最新資訊28at.com

OSGi的Bundle類加載器之間只有規則,沒有固定的委派關系。OSS28資訊網——每日最新資訊28at.com

各個Bundle加載器是平級關系。OSS28資訊網——每日最新資訊28at.com

不是雙親委派關系。OSS28資訊網——每日最新資訊28at.com

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入解析復雜SQL查詢及其在C#中的應用

下一篇: 有沒有并發編程經驗,一問這個類便知!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品久久久久久久9999| 亚洲国产精品激情在线观看| 久久久久久穴| 在线一区日本视频| 亚洲国产成人精品久久| 国产偷国产偷精品高清尤物| 欧美老女人xx| 欧美成人精品福利| 久久久综合精品| 欧美与欧洲交xxxx免费观看 | 一本色道久久综合一区| 欧美日本免费| 亚洲一区二区三区高清| 欧美性色视频在线| 亚洲视频电影在线| 国模吧视频一区| 欧美日韩精品一区二区天天拍小说| 欧美高清视频www夜色资源网| 久久一区亚洲| 欧美在线free| 欧美一区二区免费| 免费短视频成人日韩| 亚洲综合99| 国产精品美女一区二区在线观看 | 亚洲高清电影| 亚欧成人在线| 国产精品免费看| 欧美一级久久久久久久大片| 韩曰欧美视频免费观看| 久久精品国产第一区二区三区| 久久精品国产在热久久| 欧美一区二区视频97| 国产精品高潮呻吟| 亚洲一区二区三区在线看 | 精品不卡在线| 狠狠色狠狠色综合日日91app| 亚洲一二三区视频在线观看| 亚洲欧美日韩成人| 久久亚洲私人国产精品va媚药 | 国产欧美一区二区视频| 欧美一区成人| 国产精品日韩精品欧美精品| 在线亚洲观看| 欧美日韩一区二区三区在线观看免 | 国产综合精品一区| 国产一区亚洲| 黑丝一区二区三区| 亚洲二区免费| 亚洲精品字幕| 亚洲中午字幕| 久久精视频免费在线久久完整在线看| 久久久久国产精品一区| 蜜桃av一区| 欧美欧美午夜aⅴ在线观看| 欧美午夜精品久久久久免费视| 欧美日韩中文| 国产视频一区二区在线观看| 黄色亚洲在线| aa亚洲婷婷| 香蕉久久精品日日躁夜夜躁| 久久人91精品久久久久久不卡| 欧美激情第9页| 欧美午夜电影一区| 国产一区二区三区不卡在线观看| 在线观看福利一区| 一本一本久久a久久精品牛牛影视| 亚洲男同1069视频| 久久影院午夜片一区| 欧美日韩国产一中文字不卡| 国产免费亚洲高清| 亚洲激情视频在线播放| 中日韩美女免费视频网址在线观看 | 欧美成人午夜激情在线| 欧美调教vk| 韩国福利一区| 99精品国产热久久91蜜凸| 香港久久久电影| 欧美激情一区二区久久久| 国产精品一区一区| 亚洲国产美女精品久久久久∴| 亚洲一区二区三区777| 久久久国产精品一区| 欧美三级电影网| 国产欧美一区二区三区在线看蜜臀| 亚洲电影天堂av| 午夜视频在线观看一区二区| 欧美激情视频一区二区三区不卡| 国产欧美一区二区在线观看| 一本色道久久88精品综合| 久久午夜影视| 国产精品久久久一区麻豆最新章节| 一区二区在线视频播放| 亚洲午夜激情网站| 欧美不卡视频一区| 国产一区二区精品在线观看| 99视频超级精品| 美女爽到呻吟久久久久| 国产九九精品| 在线亚洲高清视频| 欧美成人激情视频| 国产一区二区高清不卡| 亚洲手机视频| 欧美日韩不卡合集视频| 在线观看成人网| 欧美在线一区二区| 国产精品成人在线| 日韩亚洲欧美成人| 男女av一区三区二区色多| 国产在线不卡| 午夜精品久久久久久久99黑人| 欧美日韩国产成人高清视频| 在线免费高清一区二区三区| 久久精品30| 国产精品日韩一区| 夜久久久久久| 欧美精品激情blacked18| 亚洲第一黄网| 久久免费99精品久久久久久| 国产麻豆午夜三级精品| 亚洲一区二区精品| 欧美日韩在线三级| 日韩视频中午一区| 欧美激情视频免费观看| 亚洲高清视频在线| 毛片av中文字幕一区二区| 韩国美女久久| 久久精品国产69国产精品亚洲| 国产精品永久| 亚洲欧美日韩一区二区在线| 国产精品jizz在线观看美国| 一区二区三区不卡视频在线观看 | 娇妻被交换粗又大又硬视频欧美| 欧美在线观看视频在线| 国产日韩精品一区二区| 午夜性色一区二区三区免费视频| 国产精品成av人在线视午夜片| 一区二区三区四区五区在线| 欧美日韩伦理在线免费| 洋洋av久久久久久久一区| 欧美日韩第一区日日骚| 99riav久久精品riav| 欧美三级日本三级少妇99| 欧美高清在线播放| 尤物yw午夜国产精品视频明星| 久久九九热免费视频| 很黄很黄激情成人| 久久午夜精品一区二区| 伊人精品成人久久综合软件| 久久一区二区三区超碰国产精品| 影音先锋亚洲视频| 女人香蕉久久**毛片精品| 亚洲欧洲综合另类在线| 欧美精品在线一区二区| 一本在线高清不卡dvd | 国产麻豆综合| 久久精品盗摄| 亚洲电影第1页| 欧美另类videos死尸| 亚洲一区二区三区影院| 国产色爱av资源综合区| 久久久综合网| 亚洲精品综合| 国产精品日韩欧美大师| 久久精品国产亚洲5555| 亚洲电影免费在线观看| 欧美日韩亚洲综合| 欧美亚洲网站| 1000部精品久久久久久久久| 欧美精品免费看| 亚洲综合导航| 一区二区三区亚洲| 欧美黄色影院| 亚洲女同精品视频| 今天的高清视频免费播放成人| 欧美国产在线视频| 亚洲尤物影院| 一色屋精品亚洲香蕉网站| 欧美激情中文字幕乱码免费| 亚洲永久免费视频| 激情综合色综合久久| 欧美激情偷拍| 亚洲午夜久久久久久久久电影院| 国产情人节一区| 欧美二区不卡| 亚洲欧美在线x视频| 在线日韩欧美视频| 欧美先锋影音| 久久亚洲精品一区二区| 中国成人亚色综合网站| 在线成人激情视频| 国产精品久久久久77777| 久久久久91| 一区二区三区精品视频| 狠狠久久综合婷婷不卡| 欧美日韩卡一卡二| 久久久九九九九| 在线一区二区三区四区| 一区二区亚洲精品| 国产精品区一区二区三| 免费永久网站黄欧美| 亚洲男人av电影| 亚洲日韩欧美一区二区在线| 国产色婷婷国产综合在线理论片a| 欧美大片在线观看一区|