国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java類加載器和類反射使用示例

2019-11-26 15:37:03
字體:
來源:轉載
供稿:網友

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

當我們啟動一個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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 恩施市| 壶关县| 临高县| 海林市| 平山县| 新宾| 广昌县| 鄂托克旗| 乌审旗| 珠海市| 南城县| 根河市| 普宁市| 临潭县| 昆明市| 孝昌县| 萍乡市| 山阴县| 柳江县| 高平市| 武宁县| 全州县| 公主岭市| 巴楚县| 根河市| 黎川县| 高密市| 府谷县| 宁武县| 那曲县| 贵德县| 临桂县| 丰城市| 永寿县| 绥宁县| 连平县| 达日县| 澄城县| 铜梁县| 达孜县| 宜州市|