Java類加載器和類加載機(jī)制實(shí)例分析
本文實(shí)例講述了Java類加載器和類加載機(jī)制。分享給大家供大家參考,具體如下:
一 點(diǎn)睛
1 類加載器負(fù)責(zé)將.class文件(可能在磁盤上,也可能在網(wǎng)絡(luò)上)加載到內(nèi)存中,并為之生成對(duì)應(yīng)的java.lang.Class對(duì)象。
2 當(dāng)JVM啟動(dòng)時(shí),會(huì)形成由三個(gè)類加載器組成的初始類加載器層次結(jié)構(gòu):
Bootstrap ClassLoader:根類加載器。
Extension ClassLoader:擴(kuò)展類加載器。
System ClassLoader:系統(tǒng)類加載器。
3 JVM的類加載機(jī)制主要有如下三種機(jī)制:
全盤負(fù)責(zé):所謂全盤負(fù)責(zé),就是說(shuō)當(dāng)一個(gè)類加載器負(fù)責(zé)加載某個(gè)Class的時(shí)候,該Class所依賴的和引用的其他Class也將由該類加載器負(fù)責(zé)載入,除非顯式使用另外一個(gè)類加載器來(lái)載入。
父類委托:所謂父類委托則是先讓parent(父)類加載器試圖加載該Class,只有在父類加載器無(wú)法加載該類時(shí)才嘗試從自己的類路徑中加載該類。
緩存機(jī)制:緩存機(jī)制將會(huì)保證所有被加載過(guò)的Class都會(huì)被緩存,當(dāng)程序中需要使用某個(gè)Class時(shí),類加載器先從緩存中搜尋該Class,只有當(dāng)緩存中不存在該Class對(duì)象時(shí),系統(tǒng)才會(huì)讀取該類對(duì)應(yīng)的二進(jìn)制數(shù)據(jù),并將其轉(zhuǎn)換成Class對(duì)象,并存入cache。這就是為什么我們修改了Class后,程序必須重新啟動(dòng)JVM,程序所作的修改才會(huì)生效的原因。
二 實(shí)戰(zhàn)
1 代碼
import java.net.*; public class BootstrapTest { public static void main(String[] args) { // 獲取根類加載器所加載的全部URL數(shù)組 URL[] urls = sun.misc.Launcher. getBootstrapClassPath().getURLs(); // 遍歷、輸出根類加載器加載的全部URL for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); } } }
2 運(yùn)行
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/resources.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/rt.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/sunrsasign.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jsse.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jce.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/charsets.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jfr.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/classes
三 實(shí)戰(zhàn)
1 代碼
import java.util.*; import java.net.*; import java.io.*; public class ClassLoaderPropTest { public static void main(String[] args) throws IOException { // 獲取系統(tǒng)類加載器 ClassLoader systemLoader = ClassLoader.getSystemClassLoader(); System.out.println("系統(tǒng)類加載器:" + systemLoader); /* 獲取系統(tǒng)類加載器的加載路徑——通常由CLASSPATH環(huán)境變量指定 如果操作系統(tǒng)沒(méi)有指定CLASSPATH環(huán)境變量,默認(rèn)以當(dāng)前路徑作為 系統(tǒng)類加載器的加載路徑 */ Enumeration<URL> em1 = systemLoader.getResources(""); while(em1.hasMoreElements()) { System.out.println(em1.nextElement()); } // 獲取系統(tǒng)類加載器的父類加載器:得到擴(kuò)展類加載器 ClassLoader extensionLader = systemLoader.getParent(); System.out.println("擴(kuò)展類加載器:" + extensionLader); System.out.println("擴(kuò)展類加載器的加載路徑:" + System.getProperty("java.ext.dirs")); System.out.println("擴(kuò)展類加載器的parent: " + extensionLader.getParent()); } }
2 運(yùn)行
系統(tǒng)類加載器:sun.misc.Launcher$AppClassLoader@18b4aac2
file:/E:/Java/IDEA_Java/out/production/IDEA_Java/
擴(kuò)展類加載器:sun.misc.Launcher$ExtClassLoader@14ae5a5
擴(kuò)展類加載器的加載路徑:D:\Program\Java\jdk1.8.0_162\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
擴(kuò)展類加載器的parent: null
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源
這篇文章主要介紹了Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源,多數(shù)據(jù)源就是在一個(gè)單一應(yīng)用中涉及到了兩個(gè)及以上的數(shù)據(jù)庫(kù),更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章介紹2022-05-05SpringBoot?項(xiàng)目的創(chuàng)建與啟動(dòng)步驟詳解
這篇文章主要介紹了SpringBoot?項(xiàng)目的創(chuàng)建與啟動(dòng),本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03springboot使用ThreadPoolTaskExecutor多線程批量插入百萬(wàn)級(jí)數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了springboot利用ThreadPoolTaskExecutor多線程批量插入百萬(wàn)級(jí)數(shù)據(jù),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02java 重定義數(shù)組的實(shí)現(xiàn)方法(與VB的ReDim相像)
java 重定義數(shù)組的實(shí)現(xiàn)方法(與VB的ReDim相像),需要的朋友可以參考一下2013-04-04Java 實(shí)現(xiàn)二叉搜索樹(shù)的查找、插入、刪除、遍歷
本文主要介紹了Java實(shí)現(xiàn)二叉搜索樹(shù)的查找、插入、刪除、遍歷等內(nèi)容。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02springboot項(xiàng)目如何設(shè)置時(shí)區(qū)
這篇文章主要介紹了springboot項(xiàng)目如何設(shè)置時(shí)區(qū)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)
下面小編就為大家?guī)?lái)一篇java中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05