Java 類加載過程與類加載器詳細介紹
1. 類加載過程
加載
通過類的全限定名(包名 + 類名),獲取到類的.class
文件,加載到元空間。
鏈接
- 驗證:檢驗
.class
文件的安全性 - 準備:為靜態(tài)類型變量分配內(nèi)存并設(shè)置默認值
- 解析:將常量池內(nèi)的符號引用轉(zhuǎn)換為直接引用,符號引用指向一個未被加載的類,或者未被加載類的字段或方法,那么解析將觸發(fā)這個類的加載
初始化
執(zhí)行類的構(gòu)造器方法init
()的過程,若該類具有父類,jvm
會保證父類的init
先執(zhí)行,然后在執(zhí)行子類的init
。
2. 類加載器
啟動類加載器
啟動類加載器是由C/C++語言實現(xiàn)的,用來加載Java核心類庫。啟動類只加載包名為:java、javax、sun開頭的類
擴展類加載器
父類加載器為啟動類加載器
。加載以下兩個目錄中的類庫:
java.ext.dirs
目錄- JDK安裝目錄:
jre/lib/ext
目錄
我們就可以將我們自己的包放在以上目錄下,就會自動加載進來了。
應(yīng)用類加載器
父類加載器為啟動類加載器
,負責加載環(huán)境變量classpath
或者系統(tǒng)屬性java.class.path
指定路徑下的類庫,是程序中默認的類加載器,我們Java程序中的類,都是由它加載完成的。
自定義類加載器
繼承java.lang.ClassLoader
類,重寫findClass()方法 。如果沒有太復(fù)雜的需求,可以直接繼承URLClassLoader
類,重寫loadClass
方法。
作用
- 加密:Java代碼可以輕易的被反編譯,如果你需要把自己的代碼進行加密以防止反編譯,可以先將編譯后的代碼用某種加密算法加密,類加密后就不能再用Java的ClassLoader去加載類了,這時就需要自定義ClassLoader在加載類的時候先解密類,然后再加載。
- 從非標準的來源加載代碼:如果你的字節(jié)碼是放在數(shù)據(jù)庫、甚至是在云端,就可以自定義類加載器,從指定的來源加載類。
雙親委派模型
jvm對class文件采用的是按需加載的方式,當需要使用該類時,jvm才會將它的class文件加載到內(nèi)存中產(chǎn)生class對象。在加載類的時候,是采用的雙親委派機制
。
- 如果一個
類加載器
接收到了類加載
的請求,它自己不會先去加載,會把這個請求委托給父類加載器
去執(zhí)行。 - 如果父類還存在父類加載器,則繼續(xù)向上委托,一直委托到
啟動類加載器:Bootstrap ClassLoader
- 如果父類加載器可以完成加載任務(wù),就返回成功結(jié)果,如果父類加載失敗,就由子類自己去嘗試加載,如果子類加載失敗就會拋出
ClassNotFoundException
異常,這就是雙親委派模式
打破雙親委派模型
用途:
- Java應(yīng)用中存在著很多服務(wù)提供者接口(Service Provider Interface,SPI),這些接口允許第三方為它們提供實現(xiàn),如常見的 SPI 有 JDBC、JNDI等,這些 SPI 的接口屬于 Java 核心庫,一般存在rt.jar包中,由Bootstrap類加載器加載。而Bootstrap類加載器無法直接加載SPI的實現(xiàn)類,所以需要反向委派給其他類加載器進行加載
- 在Tomcat服務(wù)器中,存在一個服務(wù)器運行多個不同版本但同名服務(wù)的需求,所以需要打破雙親委派模型,加載多個同名類。
方法:
- 使用上下文類加載器
- 重寫
loadClass
方法
到此這篇關(guān)于Java 類加載過程與類加載器詳細介紹的文章就介紹到這了,更多相關(guān)Java 類加載 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring通過構(gòu)造函數(shù)注入實現(xiàn)方法分析
這篇文章主要介紹了spring通過構(gòu)造函數(shù)注入實現(xiàn)方法,結(jié)合實例形式分析了spring通過構(gòu)造函數(shù)注入的原理、實現(xiàn)步驟及相關(guān)操作注意事項,需要的朋友可以參考下2019-10-10SpringBoot打包發(fā)布到linux上(centos 7)的步驟
這篇文章主要介紹了SpringBoot打包發(fā)布到linux上(centos 7)的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-12-12JFrame中添加和設(shè)置JPanel的方法實例解析
這篇文章主要介紹了JFrame中添加和設(shè)置JPanel的方法實例解析,具有一定借鑒價值2018-01-01Spring?Cloud?使用?Resilience4j?實現(xiàn)服務(wù)熔斷的方法
服務(wù)熔斷是為了保護我們的服務(wù),比如當某個服務(wù)出現(xiàn)問題的時候,控制打向它的流量,讓它有時間去恢復(fù),或者限制一段時間只能有固定數(shù)量的請求打向這個服務(wù),這篇文章主要介紹了Spring?Cloud?使用?Resilience4j?實現(xiàn)服務(wù)熔斷,需要的朋友可以參考下2022-12-12

Java 使用openoffice進行word轉(zhuǎn)換為pdf的方法步驟

Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法