您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java類加載器的特色是什么”,在日常操作中,相信很多人在Java類加載器的特色是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java類加載器的特色是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
我們平時寫了那么多的Java代碼,卻不知Java類的加載過程,豈不是很尷尬,為了打破尷尬,阿星得從Java類說起。
我們編寫的Java類也就是.java文件,通過Java編譯器編譯成.class文件,.class文件中保存著Java代碼轉換后的虛擬機指令。
當程序使用某個Java類時,JVM虛擬機會加載它的.class文件到虛擬機的內存中,負責加載工作的就是類加載器。
其實類加載器和日常生活中坐地鐵過安檢是一樣的道理,不信你看下面的圖
安檢要經過一系列的檢查過程,目的是讓進入地鐵站的人群符合乘坐標準,比如你不能感冒,不能帶威脅人生安全的物品等。
同樣類加載也要經過一系列檢查過程,這個過程稱為類加載過程。
類加載過程分為加載、驗證、準備、解析、初始化,下圖是對類加載過程簡單的介紹。
類加載過程不是本文的重點,如果對這塊有興趣深入研究的伙伴可以去自行百度或google。
下面要說說本文的重點,雙親委派模式
雙親委派機制有點像實力坑爹,出了什么事情都讓爹去擦屁股,爹解決不了,自己才承擔。
JVM虛擬機提供了3種類加載器,它們分別是啟動類加載器(Bootstrap)、擴展類加載器(Extension)、系統類加載器(System)。
每個類加載器都有明確的加載范圍:
啟動類加載器(Bootstrap):加載
擴展類加載器(Extension):加載
系統類加載器(System):加載系統類路徑classpath,也就是我們經常用到的classpath路徑,一般情況該類加載器是程序中默認的類加載器
雙親委派模式的原理也十分簡單,類加載器收到類加載請求,會委托給父類加載器去執行,父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,直到頂層類加載器,如果頂層類加載器加載到該類,就成功返回class對象,否則委托給下級類加載器去執行,依次遞歸(此處的父子關系并非通常所說的繼承關系,而是采用組合關系來實現)。
用大白話來說就是,每個兒子都很懶,有事就丟給爹去干,直到爹說這件事我也干不了,兒子自己再想辦法完成。
雙親委派模式是為了避免重復加載和核心類篡改。
在日常開發中,我們可能會有特殊的業務需求,可能就需要使用到自定義類加載器,該加載器的上級一定是系統類加載器。
資源隔離
web容器可能需要部署兩個應用程序,不同的應用程序可能會依賴同一個第三方類庫的不同版本,因此要保證每個應用程序的類庫都是獨立的,相互隔離
web容器有自己依賴的類庫,不能與應用程序的類庫混淆,基于安全考慮,應該讓容器的類庫和程序的類庫隔離
加密保護
公司的一些核心類庫,可能會把字節碼加密,這樣加載類的時候就必須對字節碼進行解密
其他來源加載類
字節碼是放在數據庫、硬盤其他路徑、甚至是在云端
類重新加載
JVM中類對象的唯一性:類加載器實例+完整類名
程序運行中,類內容發生變化,創建自定義加載器實例重新加載類,達到的熱部署效果。
這里大家有個概念,理解下就夠了,想深入探索就需要涉及源碼分析,如果大伙有興趣,評論區留言,阿星后續單獨補一篇源碼分析~
有些爹的實力恐怖如斯,為了啥事都能幫后代處理好,直接破壞雙親委派模式,深受孩兒們的喜愛。
Java應用中存在著很多服務提供者接口(Service Provider Interface,SPI),這些接口允許第三方為它們提供實現,如常見的SPI有JDBC、JNDI等,這些SPI的接口屬于Java核心庫,一般存在rt.jar包中,由啟動類加載器(Bootstrap)加載,而SPI的第三方實現代碼則是作為Java應用所依賴的jar包被存放在classpath路徑下。
由于SPI接口中的代碼需要加載第三方實現類并調用其相關函數,但SPI的核心接口類是由啟動類加載器(Bootstrap)加載的,Bootstrap加載器無法直接加載SPI的實現類。
在這種情況下,我們就需要一種特殊的類加載器來加載第三方的類庫,它就是線程上下文類加載器,線程的上下文類加載器默認設置的就是系統類加載器(System)。
到此,關于“Java類加載器的特色是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。