<font id="tbtdb"></font>

        <sub id="tbtdb"><delect id="tbtdb"></delect></sub>

          <progress id="tbtdb"></progress>
          <address id="tbtdb"></address><thead id="tbtdb"></thead>
          <font id="tbtdb"></font>

          <meter id="tbtdb"><cite id="tbtdb"><dl id="tbtdb"></dl></cite></meter>

          好程序員-千鋒教育旗下高端IT職業教育品牌

          400-811-9990
          我的賬戶
          好程序員

          專注高端IT職業培訓

          親愛的猿猿,歡迎!

          已有賬號,請

          如尚未注冊?

          [JavaEE] 好程序員Java培訓分享Java面試題之加載機制

          [復制鏈接]
          199 0
          葉子老師 發表于 2019-9-19 14:50:31 | 只看該作者 |閱讀模式 打印 上一主題 下一主題
          好程序員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.jar2,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());
          }
          好程序員Java培訓官網:http://www.xn122.com/


          精彩內容,一鍵分享給更多人!
          收藏
          收藏0
          轉播
          轉播
          分享
          淘帖0
          支持
          支持0
          反對
          反對0
          回復

          使用道具 舉報

          您需要登錄后才可以回帖

          本版積分規則

          關注我們
          好程序員
          千鋒好程序員

          北京校區(總部):北京市海淀區寶盛北里西區28號中關村智誠科創大廈

          深圳西部硅谷校區:深圳市寶安區寶安大道5010號深圳西部硅谷B座A區605-619

          杭州龍馳智慧谷校區:浙江省杭州市下沙經濟技術開發區元成路199號龍馳智慧谷B座7層

          鄭州校區:鄭州市二七區航海中路60號海為科技園C區10層、12層

          Copyright 2007-2019 北京千鋒互聯科技有限公司 .All Right

          京ICP備12003911號-5 京公安網11010802011455號

          請您保持通訊暢通1對1咨詢馬上開啟

          电影韩国三级2019在线观看