this.class.getClassLoader()怎麼理解?

EmineWang發表於2013-11-08

this.class.getClassLoader()怎麼理解?

 

java是面嚮物件語言,物件導向的語言的宗旨就是萬事萬物皆物件,那麼類也是一個物件,類裡面的屬性和方法也是物件。java裡面的所有的類都是Class類的物件,這個this.class是獲得這個類相對於Class類的物件。後面的方法是獲得這個類物件的載入器。

 

只有Class類才有getClassLoader()方法呀~
可以這麼想,我們平時講述某某類,但是我們並沒有說這個類怎麼和虛擬機器打交道,虛擬機器怎麼識別這個類.總不能全靠字串吧.
所以呢java就設計了Class這個類.用於虛擬機器對類的管理.當一個類被虛擬機器裝載完畢的時候,就會建立一個Class類的例項,對於類A就是A.class,對於類B就是B.class.
Class類也提供了許多方法來獲取類的資訊.
要知道,類的裝載器分為 "啟動類裝載器 ", "使用者定義裝載器 ".它不止一種
Class類需要儲存這些資訊.
getClassLoader()是用來獲取這個資訊的



類載入器主要分三種:bootstrap(由C語言編寫,固化在jvm上)、ExtClassLoader、AppClassLoader。而bootstrao主要載入rt.jar,ExtClassLoader主要載入Jdk安裝路徑/jre/lib/ext下的位元組碼,AppClassLoader主要載入ClassPath下的位元組碼,類載入器的委託載入原理,首先載入類一直交給父類載入器載入,一直提交到bootstrap,當父類載入器載入不到時,在一層層的返回給下一級載入器載入!


從1.2版本開始,Java引入了雙親委託模型,從而更好的保證Java平臺的安全。在此模型下,當一個裝載器被請求裝載某個類時,它首先委託自己的parent去裝載,若parent能裝載,則返回這個類所對應的Class物件,若parent不能裝載,則由parent的請求者去裝載。

如圖1所示,loader2的parent為loader1,loader1的parent為system class loader。假設loader2被要求裝載類MyClass,在parent delegation模型下,loader2首先請求loader1代為裝載,loader1再請求系統類裝載器去裝載MyClass。若系統裝載器能成功裝載,則將MyClass所對應的Class物件的reference返回給loader1,loader1再將reference返回給loader2,從而成功將類MyClass裝載進虛擬機器。若系統類裝載器不能裝載MyClass,loader1會嘗試裝載MyClass,若loader1也不能成功裝載,loader2會嘗試裝載。若所有的parent及loader2本身都不能裝載,則裝載失敗。



相關文章