本篇內(nèi)容主要講解“什么是類加載機制”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是類加載機制”吧!
創(chuàng)新互聯(lián)-成都網(wǎng)站建設公司,專注做網(wǎng)站、網(wǎng)站制作、網(wǎng)站營銷推廣,國際域名空間,網(wǎng)站空間,成都網(wǎng)站托管有關(guān)企業(yè)網(wǎng)站制作方案、改版、費用等問題,請聯(lián)系創(chuàng)新互聯(lián)。
多個java文件經(jīng)過編譯打包生成可運行的jar包,最終由java命令運行某個主類的main函數(shù)啟動程序,這里首先需要通過類加載器把主類加載到jvm。 主類在運行過程中如果使用到其他類,會逐步加載這些類。 注意,jar包里的類不是一次性全部加載的,是使用時才加載的。
從類加載到使用整個過程由如下幾步: 加載、驗證、準備、解析、初始化、使用、卸載
加載:在硬盤上查找并通過IO讀入字節(jié)碼文件,使用到類時才會加載,例如:調(diào)用類的main方法,new對象等;
驗證:校驗字節(jié)碼文件的正確性;
準備:給類的靜態(tài)變量分配內(nèi)存,并賦予默認值;
解析:將符號引用替換為直接引用,該階段會把一些靜態(tài)方法(符號引用,比如main方法)替換為指向數(shù)據(jù)所在內(nèi)存的指針或句柄等(直接引用),這就是靜態(tài)鏈接過程,這個過程是在類記載期間完成的。動態(tài)鏈接是程序運行期間完成的將符號引用替換為直接引用。
初始化:對類的靜態(tài)變量初始化為指定的值,執(zhí)行靜態(tài)代碼塊。
上面的類加載過程主要是通過類加載器來實現(xiàn)的,java里有以下幾種類加載器。
啟動類加載器:負責加載支撐JVM運行的位于JREd額lib目錄下的核心類庫;
擴展類加載器:負責加載支撐JVM運行位于JRE的lib目錄下的ext擴展目錄中的JAR類包;
應用程序加載器:負責加載ClassPath路徑下的類包,主要就是加載應用程序的類;
自定義加載器:負責加載用戶自定義路徑下的類包;
類記載器繼承了java.lang.ClassLoader類,該類有兩個核心方法,loadClass和findClass。
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name); // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } }
findClass方法默認實現(xiàn)是拋出異常,所以我們在自定義類加載器主要是重寫findClass方法。
protected Class<?> findClass(String name) throws ClassNotFoundException { throw new ClassNotFoundException(name); }
jvm類加載器是有親子層結(jié)構(gòu)的.
這里類加載就是雙親委派機制,記載某個類時, 會先委托父加載器尋找目標類,找不到再委托上層父加載器加載,如果所有父加載器再自己的加載類路徑下都找不到目標類,則再自己的類加載路徑中查找并載入目標類。
比如:Math類,最先會找應用程序類加載器加載,應用程序加載器會先委托擴展類加載器加載,擴展類加載器再委托啟動類加載器,頂層啟動類加載器在自己的類加載器路徑里找了半天沒找到Math類,則向下退回加載Math類的請求,擴展類加載器收到回復就自己加載,在自己的類加載路徑里找了半天也沒找到Math類,又向下退回Math類的加載請求給應用程序類加載器,應用程序類加載器于是在自己的類加載路徑中找到了Math類,于是就自己加載了。
雙親委派機制說簡單就是:先找父親加載,不行再由父親自己加載。
到此,相信大家對“什么是類加載機制”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
本文名稱:什么是類加載機制
本文網(wǎng)址:http://vcdvsql.cn/article10/jhjjdo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、網(wǎng)站設計、商城網(wǎng)站、品牌網(wǎng)站建設、云服務器、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)