溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中類加載器和類加載機制的示例分析

發(fā)布時間:2021-08-21 14:23:33 來源:億速云 閱讀:97 作者:小新 欄目:編程語言

這篇文章主要介紹Java中類加載器和類加載機制的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一 點睛

1 類加載器負責將.class文件(可能在磁盤上,也可能在網(wǎng)絡(luò)上)加載到內(nèi)存中,并為之生成對應(yīng)的java.lang.Class對象。

2 當JVM啟動時,會形成由三個類加載器組成的初始類加載器層次結(jié)構(gòu):

Bootstrap ClassLoader:根類加載器。

Extension ClassLoader:擴展類加載器。

System ClassLoader:系統(tǒng)類加載器。

3 JVM的類加載機制主要有如下三種機制:

全盤負責:所謂全盤負責,就是說當一個類加載器負責加載某個Class的時候,該Class所依賴的和引用的其他Class也將由該類加載器負責載入,除非顯式使用另外一個類加載器來載入。

父類委托:所謂父類委托則是先讓parent(父)類加載器試圖加載該Class,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類。

緩存機制:緩存機制將會保證所有被加載過的Class都會被緩存,當程序中需要使用某個Class時,類加載器先從緩存中搜尋該Class,只有當緩存中不存在該Class對象時,系統(tǒng)才會讀取該類對應(yīng)的二進制數(shù)據(jù),并將其轉(zhuǎn)換成Class對象,并存入cache。這就是為什么我們修改了Class后,程序必須重新啟動JVM,程序所作的修改才會生效的原因。

二 實戰(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 運行

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

三 實戰(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)沒有指定CLASSPATH環(huán)境變量,默認以當前路徑作為
   系統(tǒng)類加載器的加載路徑
   */
   Enumeration<URL> em1 = systemLoader.getResources("");
   while(em1.hasMoreElements())
   {
     System.out.println(em1.nextElement());
   }
   // 獲取系統(tǒng)類加載器的父類加載器:得到擴展類加載器
   ClassLoader extensionLader = systemLoader.getParent();
   System.out.println("擴展類加載器:" + extensionLader);
   System.out.println("擴展類加載器的加載路徑:"
      + System.getProperty("java.ext.dirs"));
   System.out.println("擴展類加載器的parent: "
      + extensionLader.getParent());
  }
}

2 運行

系統(tǒng)類加載器:sun.misc.Launcher$AppClassLoader@18b4aac2
file:/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中類加載器和類加載機制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI