您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么理解Java類加載器和類加載機制”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么理解Java類加載器和類加載機制”吧!
一 點睛
1 類加載器負責將.class文件(可能在磁盤上,也可能在網絡上)加載到內存中,并為之生成對應的java.lang.Class對象。
2 當JVM啟動時,會形成由三個類加載器組成的初始類加載器層次結構:
Bootstrap ClassLoader:根類加載器。
Extension ClassLoader:擴展類加載器。
System ClassLoader:系統類加載器。
3 JVM的類加載機制主要有如下三種機制:
全盤負責:所謂全盤負責,就是說當一個類加載器負責加載某個Class的時候,該Class所依賴的和引用的其他Class也將由該類加載器負責載入,除非顯式使用另外一個類加載器來載入。
父類委托:所謂父類委托則是先讓parent(父)類加載器試圖加載該Class,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類。
緩存機制:緩存機制將會保證所有被加載過的Class都會被緩存,當程序中需要使用某個Class時,類加載器先從緩存中搜尋該Class,只有當緩存中不存在該Class對象時,系統才會讀取該類對應的二進制數據,并將其轉換成Class對象,并存入cache。這就是為什么我們修改了Class后,程序必須重新啟動JVM,程序所作的修改才會生效的原因。
二 實戰
1 代碼
import java.net.*;public class BootstrapTest{ public static void main(String[] args) { // 獲取根類加載器所加載的全部URL數組 URL[] urls = sun.misc.Launcher. getBootstrapClassPath().getURLs(); // 遍歷、輸出根類加載器加載的全部URL for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); } }}
2 運行
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/resources.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/rt.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/sunrsasign.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/jsse.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/jce.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/charsets.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/lib/jfr.jarfile:/D:/Program/Java/jdk1.8.0_162/jre/classes
三 實戰
1 代碼
import java.util.*;import java.net.*;import java.io.*;public class ClassLoaderPropTest{ public static void main(String[] args) throws IOException { // 獲取系統類加載器 ClassLoader systemLoader = ClassLoader.getSystemClassLoader(); System.out.println("系統類加載器:" + systemLoader); /* 獲取系統類加載器的加載路徑——通常由CLASSPATH環境變量指定 如果操作系統沒有指定CLASSPATH環境變量,默認以當前路徑作為 系統類加載器的加載路徑 */ Enumeration<URL> em1 = systemLoader.getResources(""); while(em1.hasMoreElements()) { System.out.println(em1.nextElement()); } // 獲取系統類加載器的父類加載器:得到擴展類加載器 ClassLoader extensionLader = systemLoader.getParent(); System.out.println("擴展類加載器:" + extensionLader); System.out.println("擴展類加載器的加載路徑:" + System.getProperty("java.ext.dirs")); System.out.println("擴展類加載器的parent: " + extensionLader.getParent()); }}
2 運行
系統類加載器:sun.misc.Launcher$AppClassLoader@18b4aac2file:/E:/Java/IDEA_Java/out/production/IDEA_Java/擴展類加載器:sun.misc.Launcher$ExtClassLoader@14ae5a5擴展類加載器的加載路徑:D:\Program\Java\jdk1.8.0_162\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext擴展類加載器的parent: null
感謝各位的閱讀,以上就是“怎么理解Java類加載器和類加載機制”的內容了,經過本文的學習后,相信大家對怎么理解Java類加載器和類加載機制這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。