免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
類加載器ClassLoader的詳解
java文件在解釋成class文件之后,需要對里面的類進(jìn)行初始化,初始化的過程包括加載、連接、裝入三個(gè)過程,在加載的過程中會對類里面的靜態(tài)變量進(jìn)行一個(gè)初始化。下面詳細(xì)介紹下ClassLoader:
1、類的加載、連接和初始化
類初始化通常包括加載、連接、初始化三個(gè)步驟。
(1)進(jìn)程的結(jié)束
每當(dāng)運(yùn)行一個(gè)java程序時(shí),將會啟動一個(gè)java虛擬機(jī)進(jìn)程,不管程序多么復(fù)雜,有多少線程,都在這個(gè)java虛擬機(jī)進(jìn)程里。以下四種情況會使得該進(jìn)程被終止——
程序運(yùn)行到最后正常結(jié)束; 程序里遭遇了System.exit(),或者是Runtime.getRunTime().exit()代碼;程序執(zhí)行中遇到了未捕獲的異常或者錯(cuò)誤; java所在平臺強(qiáng)制結(jié)束了JVM進(jìn)程;
當(dāng)該進(jìn)程結(jié)束,那么該進(jìn)程在內(nèi)存中的狀態(tài)將會丟失,包括靜態(tài)變量的值。
(2)類的加載
類的加載是指將類的class文件讀入內(nèi)存,并為之創(chuàng)建一個(gè)java.lang.class對象。
(3)類的連接
類的連接負(fù)責(zé)把類的二進(jìn)制數(shù)據(jù)合并到JRE中,分為三個(gè)階段——
驗(yàn)證:檢驗(yàn)被加載的類是否有正確的內(nèi)部結(jié)構(gòu); 準(zhǔn)備:負(fù)責(zé)為類的靜態(tài)Field分配內(nèi)存,并設(shè)置默認(rèn)初始值;解析:將類的二進(jìn)制數(shù)據(jù)中的符號應(yīng)用替換成直接引用。
(4)類的初始化
類的初始化,主要就是對靜態(tài)Field進(jìn)行初始化。
2、類加載器
(1)類加載器簡介
類加載器負(fù)責(zé)加載所有的類,系統(tǒng)為所有載入內(nèi)存里的類都會生成一個(gè)java.lang.class對象;
同一個(gè)類只會被加載一次,在JVM中每一個(gè)不同的類都會有一個(gè)不同的類加載器負(fù)責(zé)。
類加載器在不包括用戶自定義的加載器的情況下包括三層:
Bootstrap Classloader根加載器; ExtensionClassloader擴(kuò)展類加載器; SystemClassLoader系統(tǒng)類加載器;
①根加載器,又稱為引導(dǎo)或者原始加載器,負(fù)責(zé)加載java的核心類;
②擴(kuò)展類加載器,負(fù)責(zé)加載JRE的擴(kuò)展目錄中JAR包的類;
③系統(tǒng)類加載器,又稱為應(yīng)用加載器,
負(fù)責(zé)JVM啟動時(shí)加載來自java命令的-classpath或者CLASSPATH環(huán)境變量所指定的JAR包和類路徑。一般是程序運(yùn)行的當(dāng)前路徑。所以其稱為應(yīng)用類加載器。
三個(gè)類加載器的順序是:
bootstrap classloader
|
extension classloader
|
system classloader
如果有用戶自定義的類加載器,那么在系統(tǒng)加載器后,將會執(zhí)行用戶類加載器。
(2)自定義類加載器
如果我們需要在啟動類加載時(shí)作一些特定需求的行為,那么就需要自定義類加載器了。
自定義ClassLoader需要繼承ClassLoader抽象類,重寫findClass方法,這個(gè)方法定義了ClassLoader查找class的方式。
主要可以擴(kuò)展的方法有:
findClass 定義查找Class的方式
defineClass 將類文件字節(jié)碼加載為jvm中的class
findResource 定義查找資源的方式
(3)類加載機(jī)制
JVM的類加載機(jī)制有以下三種:
全盤負(fù)責(zé):所謂全盤負(fù)責(zé),即是當(dāng)一個(gè)classloader加載一個(gè)Class的時(shí)候,這個(gè)Class所依賴的和引用的所有Class也由這個(gè)classloader負(fù)責(zé)載入,除非是顯式的使用另外一個(gè)classloader載入。
父類委托:所謂父類委托,就是先讓父類加載器先嘗試加載該Class,當(dāng)父類無法加載的時(shí)候,才是嘗試從自己的類路徑中去加載。JVM的ClassLoader采用的是樹形結(jié)構(gòu),除了BootstrapClassLoader以外,每個(gè)ClassLoader都會有一個(gè)parentClassLoader,即父類加載器,用戶自定義的ClassLoader默認(rèn)的parendClassLoader是SystemClassLoader,當(dāng)然你可以自己指定需要用哪一個(gè)ClassLoader的實(shí)例
緩存機(jī)制:所謂緩存機(jī)制就是保證所有加載過的類都會被緩存,當(dāng)程序中需要某個(gè)類時(shí),會先從緩存區(qū)中搜查該類,當(dāng)緩存區(qū)不存在該類對象時(shí),系統(tǒng)才會讀取該類的二進(jìn)制文件。
4、一些重要的方法
(1)loadClass方法
ClassLoader.loadClass()是ClassLoader的入口點(diǎn)。該方法的定義如下:
Class loadClass(String name,boolean resolve);
name是加載的類的名稱,resolve是告訴方法是不中需要解析類PS:并不是所有的類都需要解析,如果JVM只想知道這個(gè)類是否存在或找出該類的超類,那么就不需要解析該類
(2)defineClass方法
defineClass方法接受由原始字節(jié)組成的數(shù)組,并把它轉(zhuǎn)換成Class的對象。原始數(shù)組包含如從文件系統(tǒng)或網(wǎng)絡(luò)裝入的數(shù)據(jù)。defineClass管理JVM的許多復(fù)雜的實(shí)現(xiàn)層面——它把字節(jié)碼分析成運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)、校驗(yàn)有效性等,因?yàn)閐efineClass方法被標(biāo)記成final的,所以不能覆蓋它。
(3)findSytemClass方法
findSystemClass方法就是查找本的類Class文件,然后裝入
(4)resolveClass方法
我們在調(diào)用編寫自己的loadClass方法的時(shí)候可以調(diào)用resolveClass方法來獲得resolve參數(shù)
(5)findLoadedClass方法
在調(diào)用loadClass方法之前可以調(diào)用改方法來查看地ClassLoader是否已經(jīng)裝入了這個(gè)類,這樣可以避免重新裝入這個(gè)類
(6)findClass方法
在loadClass默認(rèn)實(shí)現(xiàn)調(diào)用這個(gè)新方法。findClass的用途包含classLoader的所有特殊代碼,而無須復(fù)制其他代碼
(7)getSystemClassLoader方法
在如果覆蓋findClass或loadClass,getSystemClassLoader能以實(shí)際的ClassLoader對象訪問系統(tǒng)ClassLoader(而不是固定地從findSystemClass調(diào)用它)。為了將類請求委托給父類ClassLoader,這個(gè)新方法允許ClassLoader獲取它的父類ClassLoader.當(dāng)使用特殊方法,定制的ClassLoader不能找到類時(shí),可以使用這種方法。
父類ClassLoader被定義成創(chuàng)建該ClassLoader所包含代碼的對象的ClassLoader.
(8)forName方法
在Class類中有一個(gè)靜態(tài)方法forName,這個(gè)方法和ClassLoader中的loaderClass方法的目的是一樣的,都是用來加載Class的,但是兩者在作用上卻有所區(qū)別:
loadClass加載實(shí)際上就是加載的時(shí)候并不對該類進(jìn)行解釋,因此不會初始化該類。而Class類的forName方法則相反,使用forName加載的時(shí)候就會將Class進(jìn)行解釋和初始化
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
InfoQ: Java深度歷險(xiǎn)(二)——Java類的加載、鏈接和初始化
JVM類加載機(jī)制(ClassLoader)源碼解析
類加載器不喜歡我,想我慢下來
javaEE防盜版-java之類加載
深入分析ClassLoader
JVM真香系列:輕松理解class文件到虛擬機(jī)(下)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服