亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java三個類加載器及它們的相互關(guān)系

 更新時間:2021年06月07日 11:03:15   作者:cswhl  
Java在需要使用類別的時候,才會將類別加載,Java的類別載入是由類別載入器(Class loader)來達到的,預(yù)設(shè)上,在程序啟動之后,主要會有三個類別加載器,文中詳細介紹了這三個類加載器,需要的朋友可以參考下

一、什么是類加載器?

虛擬機設(shè)計團隊把類加載階段中的“通過一個類的全限定名來獲取描述此類的二進制字節(jié)流”這個動作放到Java虛擬機外部去實現(xiàn),以便讓應(yīng)用程序自己決定如何去獲取所需要的類。實現(xiàn)這個動作的代碼模塊稱為“類加載器”

類加載器可以說是Java語言的一項創(chuàng)新,也是Java語言流行的重要原因之一,它最初是為了滿足Java Applet的需求而開發(fā)出來的。雖然目前Java Applet技術(shù)基本上已經(jīng)“死掉”,但類加載器卻在類層次劃分、OSGi、熱部署、代碼加密等領(lǐng)域大放異彩,成為了Java技術(shù)體系中一塊重要的基石,可謂是失之桑榆,收之東隅。

類加載器雖然只用于實現(xiàn)類的加載動作,但它在Java程序中起到的作用卻遠遠不限于類加載階段。對于任意一個類,都需要由加載它的類加載器和這個類本身一同確立其在Java虛擬機中的唯一性,每一個類,都擁有一個獨立的類名稱空間。這句話可以表達得更通俗一些:比較兩個類是否“相等”,只有在這兩個類是由同一個類加載器加載的前提下才有意義。否則,即使這兩個類來源于同一個Class文件,被同一個虛擬機加載,只要加載它們的類加載器不同,那這兩個類就必定不相等。

二、AppClassLoader系統(tǒng)類加載器

AppClassLoader應(yīng)用類加載器,又稱為系統(tǒng)類加載器,負責(zé)在JVM啟動時,加載來自命令java中的classpath或者java.class.path系統(tǒng)屬性或者CLASSPATH操作系統(tǒng)屬性所指定的JAR類包和類路徑

  • 獲取當(dāng)前類的類加載器:
public class AppClassLoaderTest {

    public static void main(String[] args) {
        System.out.println(ClassLoader.getSystemClassLoader());
    }

}

輸出:

sun.misc.Launcher$AppClassLoader@73d16e93

這說明AppclassLoader是當(dāng)前應(yīng)用classpath所有類的加載器。

查看ClassLoader的源碼可發(fā)現(xiàn):在沒有特定說明的情況下,用戶自定義的任何類加載器都將該類加載器作為自定義類加載器的父加載器.

  • 通過執(zhí)行下面的代碼即可獲得classpath的加載路徑:
String classPath = System.getProperty("java.class.path");
for (String path : classPath.split(";")) {
    System.out.println(path);
}

輸出:

.

通常是當(dāng)前執(zhí)行字節(jié)碼的路徑。

  • main函數(shù)的類的加載就是使用AppClassLoader加載器進行加載的,而AppClassLoader的父加載器是ExtClassLoader:
public class AppClassLoaderTest {

    public static void main(String[] args) {
        ClassLoader classLoader = Test.class.getClassLoader();
        System.out.println(classLoader);
        System.out.println(classLoader.getParent());
    }

    private static class Test {

    }

}

輸出:

sun.misc.Launcher$AppClassLoader@73d16e93 
sun.misc.Launcher$ExtClassLoader@15db9742 

三、ExtClassLoader擴展類加載器

ExtClassLoader稱為擴展類加載器,主要負責(zé)加載Java的擴展類庫,默認加載JAVA_HOME/jre/lib/ext/目錄下的所有jar包或者由java.ext.dirs系統(tǒng)屬性指定的jar包.放入這個目錄下的jar包對AppClassLoader加載器都是可見的(因為ExtClassLoader是AppClassLoader的父加載器,并且Java類加載器采用了委托機制).

  • ExtClassLoader的類掃描路徑通過執(zhí)行下面代碼來看一下:
public class ExtClassLoaderTest {
	
	public static void main(String[] args) {
		String extDirs = System.getProperty("java.ext.dirs");
		for (String path : extDirs.split(";")) {
			System.out.println(path);
		}
	}
}

執(zhí)行結(jié)果如下:

D:\TOOLS\JAVA\lib\ext 
C:\WINDOWS\Sun\Java\lib\ext 

  • 從上面的路徑中隨意選擇一個類,來看看它的類加載器是什么:
public class ExtClassLoaderTest {
	
	public static void main(String[] args) {
		ClassLoader classLoader = sun.security.ec.SunEC.class.getClassLoader();
		System.out.println(classLoader);
		System.out.println(classLoader.getParent());
	}
}

輸出:

sun.misc.Launcher$ExtClassLoader@30f39991 
null 

從輸出結(jié)果可知ExtClassLoader的父加載器為null

四、BootstrapClassLoader啟動類加載器

啟動類加載器,是Java類加載層次中最頂層的類加載器,負責(zé)加載JDK中的核心類庫,如:rt.jar、resources.jar、charsets.jar等

  • 通過如下程序獲得該類加載器從哪些地方加載了相關(guān)的jar或class文件:
import java.net.URL;

public class BootstraplassLoaderPath {
	
	public static void main(String[] args) {
		URL[] urLs = sun.misc.Launcher.getBootstrapClassPath().getURLs();
		for (URL url : urLs) {
    	System.out.println(url.toExternalForm());
		}
	}
}

輸出:

file:/D:/TOOLS/JAVA/lib/resources.jar
file:/D:/TOOLS/JAVA/lib/rt.jar
file:/D:/TOOLS/JAVA/lib/sunrsasign.jar
file:/D:/TOOLS/JAVA/lib/jsse.jar
file:/D:/TOOLS/JAVA/lib/jce.jar
file:/D:/TOOLS/JAVA/lib/charsets.jar
file:/D:/TOOLS/JAVA/lib/jfr.jar
file:/D:/TOOLS/JAVA/classes

  • 從rt.jar中選擇String類,看一下String類的類加載器是什么:
public class stringBootstraplassLoaderTest {
	
	public static void main(String[] args) {
		ClassLoader classLoader = String.class.getClassLoader();
    System.out.println(classLoader);
	}
}

輸出:

null

由于BootstrapClassLoader對Java不可見,所以返回了null,我們也可以通過某一個類的加載器是否為null來作為判斷該類是不是使用BootstrapClassLoader進行加載的依據(jù)。
另外上面提到ExtClassLoader的父加載器返回的是null,那是否說明ExtClassLoader的父加載器是BootstrapClassLoader.

Bootstrap ClassLoader是由C/C++編寫的,它本身是虛擬機的一部分,所以它并不是一個JAVA類,也就是無法在java代碼中獲取它的引用,JVM啟動時通過Bootstrap類加載器加載rt.jar等核心jar包中的class文件,之前的int.class,String.class都是由它加載。

五、加載器關(guān)系總結(jié)

JVM初始化sun.misc.Launcher并創(chuàng)建Extension ClassLoader和AppClassLoader實例。并將ExtClassLoader設(shè)置為AppClassLoader的父加載器,Bootstrap則是ExtClassLoader的父加載器.
關(guān)系圖如下:

六、參考資料

1.Java類加載器
2.一看你就懂,超詳細java中的ClassLoader詳解

到此這篇關(guān)于Java三個類加載器及它們的相互關(guān)系的文章就介紹到這了,更多相關(guān)Java類加載器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 入門圖形用戶界面設(shè)計之列表框JList

    Java 入門圖形用戶界面設(shè)計之列表框JList

    圖形界面(簡稱GUI)是指采用圖形方式顯示的計算機操作用戶界面。與早期計算機使用的命令行界面相比,圖形界面對于用戶來說在視覺上更易于接受,本篇精講Java語言中關(guān)于圖形用戶界面的列表框JList
    2022-02-02
  • Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊列)的實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊列)的實現(xiàn)

    堆(優(yōu)先隊列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹,一般用于求解topk問題。本文將利用Java語言實現(xiàn)堆,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Java設(shè)計模式編程之工廠方法模式的使用

    Java設(shè)計模式編程之工廠方法模式的使用

    這篇文章主要介紹了Java設(shè)計模式編程之工廠方法模式的使用,工廠方法模式屬于設(shè)計模式中三種工廠模式中的一種,需要的朋友可以參考下
    2016-02-02
  • hadoop?切片機制分析與應(yīng)用

    hadoop?切片機制分析與應(yīng)用

    切片這個詞對于做過python開發(fā)的同學(xué)一定不陌生,但是與hadoop中的切片有所區(qū)別,hadoop中的切片是為了優(yōu)化hadoop的job在處理過程中MapTask階段的性能達到最優(yōu)而言
    2022-02-02
  • 一次mybatis連接查詢遇到的坑實戰(zhàn)記錄

    一次mybatis連接查詢遇到的坑實戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于一次mybatis連接查詢遇到的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JAVA進階之HashMap底層實現(xiàn)解析

    JAVA進階之HashMap底層實現(xiàn)解析

    Hashmap是java面試中經(jīng)常遇到的面試題,大部分都會問其底層原理與實現(xiàn),為了能夠溫故而知新,特地寫了這篇文章,以便時時學(xué)習(xí)
    2021-11-11
  • Java數(shù)組,去掉重復(fù)值、增加、刪除數(shù)組元素的方法

    Java數(shù)組,去掉重復(fù)值、增加、刪除數(shù)組元素的方法

    下面小編就為大家?guī)硪黄狫ava數(shù)組,去掉重復(fù)值、增加、刪除數(shù)組元素的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 詳解java平臺解析協(xié)議相關(guān)備忘

    詳解java平臺解析協(xié)議相關(guān)備忘

    這篇文章主要介紹了詳解java平臺解析協(xié)議相關(guān)備忘,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java的內(nèi)存區(qū)域與內(nèi)存溢出異常你了解嗎

    Java的內(nèi)存區(qū)域與內(nèi)存溢出異常你了解嗎

    這篇文章主要為大家詳細介紹了Java的內(nèi)存區(qū)域與內(nèi)存溢出異常,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Mybatis數(shù)據(jù)批量插入如何實現(xiàn)

    Mybatis數(shù)據(jù)批量插入如何實現(xiàn)

    這篇文章主要介紹了Mybatis數(shù)據(jù)批量插入如何實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07

最新評論