背景1:我們知道java中類加載機制采用雙親委托制機制,一個classloader要加載一個類,首先會委托他的上級加載器嘗試加載,如果上級加載不成功才會自己加載。背景2:我們自己的類的加載器是AppClassLoader,它的上級是ExtClassLoader。ExtClassLoader會在%JAVA_HONME%/jre/lib/ext目錄中尋找、加載類。背景3:我自己寫了一個Test.java,編譯后為Test.class。按背景2,Test的加載器是AppClassLoader,再根據背景1,它會首先委托ExtClassLoader去嘗試加載。ExtClassLoader在%JAVA_HONME%/jre/lib/ext中找不到該類,故加載失敗,所以最終還是會由AppClassLoader來加載Test.class。問題:可是,如果我把編譯好的Test.class打成jar包,放到%JAVA_HONME%/jre/lib/ext目錄中,那么當AppClassLoader委托給ExtClassLoader加載時,ExtClassLoader會加載成功嗎?這個問題困擾我的地方在于,按照背景2,貌似的確應該由ExtClassLoader去加載Test。但我感覺這違反直覺,我要運行的是本地的Test.class,但是JVM卻加載了另一個Test.class(%JAVA_HONME%/jre/lib/ext下),那么本地這個Test.class還有什么意義?
1 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
ext下面的類會被優先加載,這沒什么違背直覺的啊,或者說是你把Test拷到ext里面是違背直覺的,反過來想如果你在自己的工程里面寫個java.lang.String,jvm也會優先加載上級loader下面的String.class,要不怎么保證jvm的安全性
添加回答
舉報
0/150
提交
取消