java類加載相關(guān)知識總結(jié)
類加載器
- 類加載器作用
負(fù)責(zé)將.class文件(存儲的物理文件)加載到內(nèi)存中
- 類加載器過程
加載:通過全類名獲取這個類準(zhǔn)備用流傳輸,加載進(jìn)內(nèi)存,加載完畢創(chuàng)建一個Class對象
鏈接
驗證:確保Class文件字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身安全
(文件中的信息是否符合虛擬機(jī)規(guī)范有沒有安全隱患)準(zhǔn)備:負(fù)責(zé)為類的類變量(被static修飾的變量)分配內(nèi)存,并設(shè)置默認(rèn)初始化值
(初始化靜態(tài)變量)解析:將類的二進(jìn)制數(shù)據(jù)流中的符號引用替換為直接引用
(本類中如果用到了其他類,此時就需要找到對應(yīng)的類)
初始化:根據(jù)程序員通過程序制定的主觀計劃去初始化類變量和其他資源(也就是自己寫的構(gòu)造函數(shù)初始化)
(靜態(tài)變量賦值以及初始化其他資源)
- 類加載分類
Bootstrap class loader:虛擬機(jī)的內(nèi)置類加載器,通常表示為null ,并且沒有父null
Platform class loader:平臺類加載器,負(fù)責(zé)加載JDK中一些特殊的模塊
System class loader:系統(tǒng)類加載器,負(fù)責(zé)加載用戶類路徑上所指定的類庫
類加載器繼承關(guān)系
System的父加載器為Platform
Platform的父加載器為Bootstrap
代碼示例
public class ClassLoaderDemo1 {
public static void main(String[] args) {
//獲取系統(tǒng)類加載器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//獲取系統(tǒng)類加載器的父加載器 --- 平臺類加載器
ClassLoader classLoader1 = systemClassLoader.getParent();
//獲取平臺類加載器的父加載器 --- 啟動類加載器
ClassLoader classLoader2 = classLoader1.getParent();
System.out.println("系統(tǒng)類加載器" + systemClassLoader);
System.out.println("平臺類加載器" + classLoader1);
System.out.println("啟動類加載器" + classLoader2);
}
}
雙親委派模型
如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器去執(zhí)行,如果父類加載器還存在其父類加載器,則進(jìn)一步向上委托,依次遞歸,請求最終將到達(dá)頂層的啟動類加載器,如果父類加載器可以完成類加載任務(wù),就成功返回,倘若父類加載器無法完成此加載任務(wù),子加載器才會嘗試自己去加載,這就是雙親委派模式(一句話意思就是加載類先讓父類的加載器去加載,如果父類加載不了就會重新向下讓子類加載器依次去加載知道找到加載的類加載器)
ClassLoader 中的兩個方法
方法介紹
| 方法名 | 說明 |
| public static ClassLoader getSystemClassLoader() | 獲取系統(tǒng)類加載器 |
| public InputStream getResourceAsStream(String name) | 加載某一個資源文件 |
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo {
public static void main(String[] args) throws IOException {
//獲取系統(tǒng)類加載器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//利用加載器去加載一個指定的文件
//參數(shù):文件的路徑(放在src的根目錄下,默認(rèn)去那里加載)
//返回值:字節(jié)流。
InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println(prop.getProperty("name"));
is.close();
}
}
到此這篇關(guān)于java類加載相關(guān)知識總結(jié)的文章就介紹到這了,更多相關(guān)java類加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了一種Spring實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06
Java集合排序規(guī)則接口Comparator用法解析
這篇文章主要介紹了Java集合排序規(guī)則接口Comparator用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
詳解java操作Redis數(shù)據(jù)庫的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoo
這篇文章主要介紹了java操作Redis數(shù)據(jù)庫的redis工具,包括RedisUtil,jedis工具JedisUtil,JedisPoolUtil工具,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08
Spring gateway配置Spring Security實現(xiàn)統(tǒng)一權(quán)限驗證與授權(quán)示例源碼
這篇文章主要介紹了Spring gateway配置Spring Security實現(xiàn)統(tǒng)一權(quán)限驗證與授權(quán),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
Mybatis使用collection標(biāo)簽進(jìn)行樹形結(jié)構(gòu)數(shù)據(jù)查詢時攜帶外部參數(shù)查詢
這篇文章主要介紹了Mybatis使用collection標(biāo)簽進(jìn)行樹形結(jié)構(gòu)數(shù)據(jù)查詢時攜帶外部參數(shù)查詢,需要的朋友可以參考下2023-10-10
Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換)
這篇文章主要介紹了Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot復(fù)雜參數(shù)應(yīng)用詳細(xì)講解
我們在編寫接口時會傳入復(fù)雜參數(shù),如Map、Model等,這種類似的參數(shù)會有相應(yīng)的參數(shù)解析器進(jìn)行解析,并且最后會將解析出的值放到request域中,下面我們一起來探析一下其中的原理2022-09-09

