好程序員Java學(xué)習(xí)路線分享Java面試題之加載機(jī)制

好程序員Java學(xué)習(xí)路線分享Java面試題之加載機(jī)制,面試場(chǎng)景:
面試官第一問:
請(qǐng)問,我現(xiàn)在編寫一個(gè)類,類全名如下:java.lang.String,
我們知道JDK也給我們聽過了一個(gè)java.lang.String,
那么,我們編寫的這個(gè)String類能否替換到JDK默認(rèn)提供,也就是說程序?qū)嶋H運(yùn)行的時(shí)候,會(huì)加載我們的String還是JDK的String?為什么?
如果,你無法確定?那么第二問:
了解類的加載機(jī)制嗎?知道JDK的類加載器嗎?雙親委托機(jī)制說說看
如果,你還不了解,那么我們聊聊今天的天氣吧!
1,首先,什么是類的加載機(jī)制?
JVM使用Java類的流程如下:
1,Java源文件----編譯---->class文件
2,類加載器ClassLoader會(huì)讀取這個(gè).class文件,并將其轉(zhuǎn)化為java.lang.Class的實(shí)例。有了該實(shí)例,JVM就可以使用他來創(chuàng)建對(duì)象,調(diào)用方法等操作了。
那么ClassLoader是以一種什么機(jī)制來加載Class的?
這就是我們要談的類的加載機(jī)制!
2,搞清楚這個(gè)問題,首先要知道,我們用到的Class文件都有哪些來源?
1,Java內(nèi)部自帶的核心類,位于$JAVA_HOME/jre/lib,其中最著名的莫過于rt.jar
2,Java的擴(kuò)展類,位于$JAVA_HOME/jre/lib/ext目錄下
3,我們自己開發(fā)的類或項(xiàng)目開發(fā)用到的第三方j(luò)ar包,位于我們項(xiàng)目的目錄下,比如WEB-INF/lib目錄
3,那么,針對(duì)這些Class,JDK是怎么分工的?誰(shuí)來加載這些Class?
針對(duì)不同的來源,Java分了不同的ClassLoader來加載
1,Java核心類,這些Java運(yùn)行的基礎(chǔ)類,由一個(gè)名為BootstrapClassLoader加載器負(fù)責(zé)加載。這個(gè)類加載器被稱為“根加載器或引導(dǎo)加載器”
注意:BootstrapClassLoader不繼承ClassLoader,是由JVM內(nèi)部實(shí)現(xiàn)。法力無邊,所以你通過java程序訪問不到,得到的是null。
2,Java擴(kuò)展類,是由ExtClassLoader負(fù)責(zé)加載,被稱為“擴(kuò)展類加載器”。
3,項(xiàng)目中編寫的類,是由AppClassLoader來負(fù)責(zé)加載,被稱為“系統(tǒng)類加載器”。
4, 那憑什么,我就知道這個(gè)類應(yīng)該由老大BootStrapClassLoader來加載?
這里面就要基于雙親委托機(jī)制?
所謂雙親委托機(jī)制,就是加載一個(gè)類,會(huì)先獲取到一個(gè)系統(tǒng)類加載器AppClassLoader的實(shí)例,然后往上層層請(qǐng)求,先由BootstarpClassLoader去加載,
如果BootStrapClassLoader發(fā)現(xiàn)沒有,再下發(fā)給ExtClassLoader去加載,還是沒有,才由AppClassLoader去加載。
如果還是沒有,則報(bào)錯(cuò)
5,所以,上述問題的答案你清楚了嗎?
JDK提供java.lang.String類,默認(rèn)在rt.jar這個(gè)包里面,所以,默認(rèn)會(huì)由BootstarpClassLoader加載,
所以,我們自己編寫的java.lang.String,都沒有機(jī)會(huì)被加載到
6,給兩段程序看看,類加載器的關(guān)系
案例1:創(chuàng)建一個(gè)自己的類,然后打印其類加載器

目前成都創(chuàng)新互聯(lián)公司已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、懷寧網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

public class ClassLoaderTest {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> clazz = Class.forName("com.qianfeng.thread.client.Programmer");
        ClassLoader classLoader = clazz.getClassLoader();
        System.out.println(classLoader.getClass().getSimpleName());
    }
}

案例2:打印其雙親類加載器信息

while(classLoader.getParent() != null){
       classLoader = classLoader.getParent();
       System.out.println("-->"+classLoader.getClass().getSimpleName());
}

網(wǎng)頁(yè)標(biāo)題:好程序員Java學(xué)習(xí)路線分享Java面試題之加載機(jī)制
標(biāo)題來源:http://muchs.cn/article14/ipgpge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、ChatGPT、虛擬主機(jī)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)