java類載入器和類反射使用樣本_java

來源:互聯網
上載者:User

一、一個命令對應一個進程。

當我們啟動一個Java程式,即啟動一個main方法時,都將啟動一個Java虛擬機器進程,不管這個進程有多麼複雜。而不同的JVM進程之間是不會相互影響的。這也就是為什麼說,Java程式只有一個入口——main方法,讓虛擬機器調用。而兩個mian方法,對應的是2個JVM進程,啟動的是兩個不同的類載入器,操作的實際上是不同的類。故而不會互相影響。

二、類載入。

當我們使用一個類,如果這個類還未載入到記憶體中,系統會通過載入、串連、初始化對類進行初始化。

1、類載入:指的是將類的class檔案讀入JVM,並為之建立一個Class對象。

2、類串連:指的是把類的位元據合并到JRE中,這又分為3個階段:

a)、校正:檢查載入Class檔案資料的正確性。

b)、準備:給類的靜態變數分配儲存空間,並進行預設初始化。

c)、解析:將類的位元據中的符號引用替換成直接引用。

3、初始化:對類的靜態變數、靜態初始化塊進行初始化。

(注意:一個final類型的靜態屬性,如果在編譯時間已經得到了屬性值,那麼調用該屬性時,不會導致該類初始化,因為這個相當於使用常量;

使用ClassLoader()方法,只是載入該類,並未初始化。)

三、類載入器。

類載入器就是負責將.class檔案載入到記憶體中,並為之產生對應的java.lang.Class對象,它負責載入所有的類,而一旦一個類被載入入JVM中,就不會被再次載入了。

在Java中,一個類用其全限定類名(即包名+類名)作為標識。

而在JVM中,一個類用其全限定類名和其類載入器作為標識。

JVM運行時會產生3個ClassLoader,分別為:BootstrapClassLoader(根類載入器)、ExtClassLoader(擴充類載入器)和AppClassLoader(系統類別載入器)。UML結構如下:

其中,BootstrapClassLoader負責載入JRE的核心類庫,它不是ClassLoader的子類,使用C++編寫,因此我們在Java中看不到它,通過其子類的getParent()方法擷取時,將返回null。BootstrapClassLoader負責裝載JRE目標下的rt.jar、charsets.jar等Java核心類庫。

如圖可知,ExtClassLoader和AppClassLoader為ClassLoader的子類。在API中看不到它們,他們位於rt.jar檔案中。全限定類名分別為:

sun.misc.Launcher$ExtClassLoader 和 sun.misc.Launcher$AppClassLoader.

其中,ExtClassLoader負責裝載JRE擴充目錄ext中JAR包,而AppClassLoader負責裝載Classpath路徑下的類包。

測試如下:

複製代碼 代碼如下:

package com.stopTalking.crazy;
public class TestClassLoader {
public static void main(String[] args) {
//擷取當前線程的類裝載器 
ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
//擷取System類的類裝載器 
ClassLoader loader1 = System.class.getClassLoader(); 
//擷取本類TestClassLoader的類裝載器loader2 
ClassLoader loader2 = TestClassLoader.class.getClassLoader(); 
//擷取loader2的父類 
ClassLoader loader3 = loader2.getParent(); 
//擷取loader2的父類的父類 
ClassLoader loader4 = loader3.getParent(); 
System.out.println(loader); 
System.out.println(loader1); 
System.out.println(loader2); 
System.out.println(loader3); 
System.out.println(loader4); 

}

控制台輸出:

複製代碼 代碼如下:

//當前線程類擷取的類載入器是AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
//System類為根裝載器載入,java中訪問不到,所以為null
null
//本類的類載入器當然也是AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
sun.misc.Launcher$ExtClassLoader@1c78e57
null

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.