好程式設計師Java學習路線分享Java面試題之載入機制
好程式設計師Java學習路線分享Java面試題之 載入機制 , 面試場景:
面試官第一問:
請問,我現在編寫一個類,類全名如下:java.lang.String,
我們知道JDK也給我們聽過了一個java.lang.String,
那麼,我們編寫的這個String類能否替換到JDK預設提供,也就是說程式實際執行的時候,會載入我們的String還是JDK的String?為什麼?
如果,你無法確定?那麼第二問:
瞭解類的載入機制嗎?知道JDK的類載入器嗎?雙親委託機制說說看
如果,你還不瞭解,那麼我們聊聊今天的天氣吧!
1,首先,什麼是類的載入機制?
JVM使用Java類的流程如下:
1,Java原始檔----編譯---->class檔案
2,類載入器ClassLoader會讀取這個.class檔案,並將其轉化為java.lang.Class的例項。有了該例項,JVM就可以使用他來建立物件,呼叫方法等操作了。
那麼ClassLoader是以一種什麼機制來載入Class的?
這就是我們要談的類的載入機制!
2,搞清楚這個問題,首先要知道,我們用到的Class檔案都有哪些來源?
1,Java內部自帶的核心類,位於$JAVA_HOME/jre/lib,其中最著名的莫過於rt.jar
2,Java的擴充套件類,位於$JAVA_HOME/jre/lib/ext目錄下
3,我們自己開發的類或專案開發用到的第三方jar包,位於我們專案的目錄下,比如WEB-INF/lib目錄
3,那麼,針對這些Class,JDK是怎麼分工的?誰來載入這些Class?
針對不同的來源,Java分了不同的ClassLoader來載入
1,Java核心類,這些Java執行的基礎類,由一個名為BootstrapClassLoader載入器負責載入。這個類載入器被稱為“根載入器或引導載入器”
注意:BootstrapClassLoader不繼承ClassLoader,是由JVM內部實現。法力無邊,所以你透過java程式訪問不到,得到的是null。
2,Java擴充套件類,是由ExtClassLoader負責載入,被稱為“擴充套件類載入器”。
3,專案中編寫的類,是由AppClassLoader來負責載入,被稱為“系統類載入器”。
4, 那憑什麼,我就知道這個類應該由老大BootStrapClassLoader來載入?
這裡面就要基於雙親委託機制?
所謂雙親委託機制,就是載入一個類,會先獲取到一個系統類載入器AppClassLoader的例項,然後往上層層請求,先由BootstarpClassLoader去載入,
如果BootStrapClassLoader發現沒有,再下發給ExtClassLoader去載入,還是沒有,才由AppClassLoader去載入。
如果還是沒有,則報錯
5,所以,上述問題的答案你清楚了嗎?
JDK提供java.lang.String類,預設在rt.jar這個包裡面,所以,預設會由BootstarpClassLoader載入,
所以,我們自己編寫的java.lang.String,都沒有機會被載入到
6,給兩段程式看看,類載入器的關係
案例1:建立一個自己的類,然後列印其類載入器
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());
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2657658/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java學習路線分享JVM類載入機制程式設計師JavaJVM
- 好程式設計師Java學習路線分享Spring常見面試題程式設計師JavaSpring面試題
- 好程式設計師Java分享JVM類載入機制程式設計師JavaJVM
- 好程式設計師Java學習路線分享Redis快速入門程式設計師JavaRedis
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享SpringCloud程式設計師JavaSpringGCCloud
- 好程式設計師Java學習路線之集程式設計師Java
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java學習路線分享SpringMVC之MVC概述程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- 好程式設計師Java學習路線分享mybatis對映程式設計師JavaMyBatis
- 好程式設計師Java教程分享Java面試題之Hibernate程式設計師Java面試題
- 好程式設計師Java學習路線分享MyBatis之關聯查詢程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享Java-String常用方法程式設計師Java
- 好程式設計師Java學習路線分享Java中的位移運算程式設計師Java
- 好程式設計師Java學習路線分享JVM相關概念程式設計師JavaJVM
- 好程式設計師Java學習路線分享maven是什麼程式設計師JavaMaven
- 好程式設計師Java學習路線分享原生Ajax的使用程式設計師Java
- 好程式設計師Java學習路線分享SpringMVC之請求和響應程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享Java弱引用的理解與使用程式設計師Java
- 好程式設計師Java學習路線分享Java案例-封裝JDBC工具類程式設計師Java封裝JDBC
- 好程式設計師Java學習路線分享怎麼理解Java物件導向程式設計師Java物件
- 好程式設計師Java培訓分享Java面試題之Java集合篇三程式設計師Java面試題
- 好程式設計師Java學習路線分享Dubbo架構介紹程式設計師Java架構
- 好程式設計師Java學習路線分享多執行緒概念程式設計師Java執行緒
- 好程式設計師Java學習路線分享MySQL目錄結構程式設計師JavaMySql
- 好程式設計師Java學習路線分享finalize()方法詳解程式設計師Java
- 好程式設計師Java學習路線分享三大特性之多型程式設計師Java多型
- 好程式設計師Java學習路線之SpringMVC之基本配置程式設計師JavaSpringMVC
- 好程式設計師web前端學習路線分享前端基礎面試題程式設計師Web前端面試題
- 好程式設計師Java學習路線分享MyBatis之執行緒最佳化程式設計師JavaMyBatis執行緒
- 好程式設計師java分享Java面試寶典:類的載入過程程式設計師Java面試
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 好程式設計師Java學習路線分享如何處理中文引數程式設計師Java
- 好程式設計師Java學習路線之MySQL的執行計劃程式設計師JavaMySql
- 好程式設計師Java分享Javamain十個面試題程式設計師JavaAI面試題
- 好程式設計師分享:Java面試題常見問題程式設計師Java面試題