java類(lèi)加載器和類(lèi)反射使用示例
一、一個(gè)命令對(duì)應(yīng)一個(gè)進(jìn)程。
當(dāng)我們啟動(dòng)一個(gè)Java程序,即啟動(dòng)一個(gè)main方法時(shí),都將啟動(dòng)一個(gè)Java虛擬機(jī)進(jìn)程,不管這個(gè)進(jìn)程有多么復(fù)雜。而不同的JVM進(jìn)程之間是不會(huì)相互影響的。這也就是為什么說(shuō),Java程序只有一個(gè)入口——main方法,讓虛擬機(jī)調(diào)用。而兩個(gè)mian方法,對(duì)應(yīng)的是2個(gè)JVM進(jìn)程,啟動(dòng)的是兩個(gè)不同的類(lèi)加載器,操作的實(shí)際上是不同的類(lèi)。故而不會(huì)互相影響。
二、類(lèi)加載。
當(dāng)我們使用一個(gè)類(lèi),如果這個(gè)類(lèi)還未加載到內(nèi)存中,系統(tǒng)會(huì)通過(guò)加載、連接、初始化對(duì)類(lèi)進(jìn)行初始化。
1、類(lèi)加載:指的是將類(lèi)的class文件讀入JVM,并為之創(chuàng)建一個(gè)Class對(duì)象。
2、類(lèi)連接:指的是把類(lèi)的二進(jìn)制數(shù)據(jù)合并到JRE中,這又分為3個(gè)階段:
a)、校驗(yàn):檢查載入Class文件數(shù)據(jù)的正確性。
b)、準(zhǔn)備:給類(lèi)的靜態(tài)變量分配存儲(chǔ)空間,并進(jìn)行默認(rèn)初始化。
c)、解析:將類(lèi)的二進(jìn)制數(shù)據(jù)中的符號(hào)引用替換成直接引用。
3、初始化:對(duì)類(lèi)的靜態(tài)變量、靜態(tài)初始化塊進(jìn)行初始化。
(注意:一個(gè)final類(lèi)型的靜態(tài)屬性,如果在編譯時(shí)已經(jīng)得到了屬性值,那么調(diào)用該屬性時(shí),不會(huì)導(dǎo)致該類(lèi)初始化,因?yàn)檫@個(gè)相當(dāng)于使用常量;
使用ClassLoader()方法,只是加載該類(lèi),并未初始化。)
三、類(lèi)加載器。
類(lèi)加載器就是負(fù)責(zé)將.class文件加載到內(nèi)存中,并為之生成對(duì)應(yīng)的java.lang.Class對(duì)象,它負(fù)責(zé)加載所有的類(lèi),而一旦一個(gè)類(lèi)被加載入JVM中,就不會(huì)被再次載入了。
在Java中,一個(gè)類(lèi)用其全限定類(lèi)名(即包名+類(lèi)名)作為標(biāo)識(shí)。
而在JVM中,一個(gè)類(lèi)用其全限定類(lèi)名和其類(lèi)加載器作為標(biāo)識(shí)。
JVM運(yùn)行時(shí)會(huì)產(chǎn)生3個(gè)ClassLoader,分別為:BootstrapClassLoader(根類(lèi)加載器)、ExtClassLoader(擴(kuò)展類(lèi)加載器)和AppClassLoader(系統(tǒng)類(lèi)加載器)。UML結(jié)構(gòu)如下:
其中,BootstrapClassLoader負(fù)責(zé)加載JRE的核心類(lèi)庫(kù),它不是ClassLoader的子類(lèi),使用C++編寫(xiě),因此我們?cè)贘ava中看不到它,通過(guò)其子類(lèi)的getParent()方法獲取時(shí),將返回null。BootstrapClassLoader負(fù)責(zé)裝載JRE目標(biāo)下的rt.jar、charsets.jar等Java核心類(lèi)庫(kù)。
如圖可知,ExtClassLoader和AppClassLoader為ClassLoader的子類(lèi)。在API中看不到它們,他們位于rt.jar文件中。全限定類(lèi)名分別為:
sun.misc.Launcher$ExtClassLoader 和 sun.misc.Launcher$AppClassLoader.
其中,ExtClassLoader負(fù)責(zé)裝載JRE擴(kuò)展目錄ext中JAR包,而AppClassLoader負(fù)責(zé)裝載Classpath路徑下的類(lèi)包。
測(cè)試如下:
package com.stopTalking.crazy;
public class TestClassLoader {
public static void main(String[] args) {
//獲取當(dāng)前線程的類(lèi)裝載器
ClassLoader loader = Thread.currentThread().getContextClassLoader();
//獲取System類(lèi)的類(lèi)裝載器
ClassLoader loader1 = System.class.getClassLoader();
//獲取本類(lèi)TestClassLoader的類(lèi)裝載器loader2
ClassLoader loader2 = TestClassLoader.class.getClassLoader();
//獲取loader2的父類(lèi)
ClassLoader loader3 = loader2.getParent();
//獲取loader2的父類(lèi)的父類(lèi)
ClassLoader loader4 = loader3.getParent();
System.out.println(loader);
System.out.println(loader1);
System.out.println(loader2);
System.out.println(loader3);
System.out.println(loader4);
}
}
控制臺(tái)輸出:
//當(dāng)前線程類(lèi)獲取的類(lèi)加載器是AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
//System類(lèi)為根裝載器加載,java中訪問(wèn)不到,所以為null
null
//本類(lèi)的類(lèi)加載器當(dāng)然也是AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
sun.misc.Launcher$ExtClassLoader@1c78e57
null
相關(guān)文章
SpringBoot遠(yuǎn)程訪問(wèn)redis服務(wù)器問(wèn)題剖析
使用了SpringBoot的項(xiàng)目,在遠(yuǎn)程連接Redis服務(wù)器時(shí),會(huì)遇倒一些小問(wèn)題,下面通過(guò)本文給大家全面解析SpringBoot遠(yuǎn)程訪問(wèn)redis服務(wù)器問(wèn)題,需要的朋友參考下吧2017-04-04java8 多個(gè)list對(duì)象用lambda求差集操作
這篇文章主要介紹了java8 多個(gè)list對(duì)象用lambda求差集操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Mybatis控制臺(tái)打印Sql語(yǔ)句的實(shí)現(xiàn)代碼
MyBatis是一個(gè)支持普通SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架,下面給大家介紹Mybatis控制臺(tái)打印Sql語(yǔ)句的實(shí)現(xiàn)代碼,非常不錯(cuò),感興趣的朋友一起看下吧2016-07-07Spring Boot中快速操作Mongodb數(shù)據(jù)庫(kù)指南
這篇文章主要給大家介紹了關(guān)于Spring Boot中如何快速操作Mongodb的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Java并發(fā)編程之ReentrantLock實(shí)現(xiàn)原理及源碼剖析
ReentrantLock 是常用的鎖,相對(duì)于Synchronized ,lock鎖更人性化,閱讀性更強(qiáng),文中將會(huì)詳細(xì)的說(shuō)明,請(qǐng)君往下閱讀2021-09-09實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用
這篇文章主要介紹了實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10JAXB簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了JAXB簡(jiǎn)介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08