java類加載相關知識總結
類加載器
- 類加載器作用
負責將.class文件(存儲的物理文件)加載到內存中
- 類加載器過程
加載:通過全類名獲取這個類準備用流傳輸,加載進內存,加載完畢創(chuàng)建一個Class對象
鏈接
驗證:確保Class文件字節(jié)流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身安全
(文件中的信息是否符合虛擬機規(guī)范有沒有安全隱患)準備:負責為類的類變量(被static修飾的變量)分配內存,并設置默認初始化值
(初始化靜態(tài)變量)解析:將類的二進制數(shù)據(jù)流中的符號引用替換為直接引用
(本類中如果用到了其他類,此時就需要找到對應的類)
初始化:根據(jù)程序員通過程序制定的主觀計劃去初始化類變量和其他資源(也就是自己寫的構造函數(shù)初始化)
(靜態(tài)變量賦值以及初始化其他資源)
- 類加載分類
Bootstrap class loader:虛擬機的內置類加載器,通常表示為null ,并且沒有父null
Platform class loader:平臺類加載器,負責加載JDK中一些特殊的模塊
System class loader:系統(tǒng)類加載器,負責加載用戶類路徑上所指定的類庫
類加載器繼承關系
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í)行,如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終將到達頂層的啟動類加載器,如果父類加載器可以完成類加載任務,就成功返回,倘若父類加載器無法完成此加載任務,子加載器才會嘗試自己去加載,這就是雙親委派模式(一句話意思就是加載類先讓父類的加載器去加載,如果父類加載不了就會重新向下讓子類加載器依次去加載知道找到加載的類加載器)
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的根目錄下,默認去那里加載) //返回值:字節(jié)流。 InputStream is = systemClassLoader.getResourceAsStream("prop.properties"); Properties prop = new Properties(); prop.load(is); System.out.println(prop.getProperty("name")); is.close(); } }
到此這篇關于java類加載相關知識總結的文章就介紹到這了,更多相關java類加載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot+MyBatist實現(xiàn)前后臺交互登陸功能方式
這篇文章主要介紹了Springboot+MyBatist實現(xiàn)前后臺交互登陸功能方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01解決Eclipse/STS中出現(xiàn)Resource is out of sync with the file system
今天小編就為大家分享一篇關于解決Eclipse/STS中出現(xiàn)Resource is out of sync with the file system的異常問題,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12詳解使用Spring?Data?repository進行數(shù)據(jù)層的訪問問題
這篇文章主要介紹了使用Spring?Data?repository進行數(shù)據(jù)層的訪問,抽象出Spring Data repository是因為在開發(fā)過程中,常常會為了實現(xiàn)不同持久化存儲的數(shù)據(jù)訪問層而寫大量的大同小異的代碼,本文給大家介紹的非常詳細,需要的朋友參考下吧2022-06-06詳解使用Spring3 實現(xiàn)用戶登錄以及權限認證
這篇文章主要介紹了詳解使用Spring3 實現(xiàn)用戶登錄以及權限認證,這里整理了詳細的代碼,有需要的小伙伴可以參考下。2017-03-03利用ScriptEngineManager實現(xiàn)字符串公式靈活計算的方法
今天小編就為大家分享一篇利用ScriptEngineManager實現(xiàn)字符串公式靈活計算的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07