ClassLoader對類的級聯載入

2021-08-29 16:37:25 字數 1375 閱讀 8611

在乙個classloader例項中,如果載入某個class,那麼被載入的class是屬於該classloader所定義的namespace之內的。表現為不同的classloader例項雖然載入的class完全相同,但是不能夠相互型別轉化,而且不能夠通過型別轉換成其他classloader載入的類。

但是在自定義的customclassloader中,(1)test test=(test)clazz.newinstance()的型別轉換是成功的,而且轉換的是systemclassloader所載入的test.class;(2)testsub test2=(testsub)clazz.newinstance()的型別轉換是失敗的。

這是為什麼呢?

public class customclassloader extends classloader

public class getclass(string arg) catch (filenotfoundexception e) catch (ioexception e)

return defineclass(arg,classcode, 0, classcode.length);

}try catch (classnotfoundexception e)

return null;

}public static void main(string args) catch (instantiationexception e) catch (illegalacces***ception e) }}

答案就在於customclassloader並未覆蓋父類的loadclass方法,在該例子中,雖然是通過customclassloader.load方法,來呼叫defineclass方法載入class,但是該defineclass方法仍然需要呼叫classloader.loadclass方法來級聯載入與之相關的類,包含其父類,介面。因此該例子中僅僅是對位元組碼檔案testsub.class進行了load,而test仍然是由systemclassloader所載入,因此會出現test test=(test)clazz.newinstance()成功執行,而testsub test2=(testsub)clazz.newinstance()執行失敗的情況。

如果將customclassloader.load方法名稱改變為loadclass,則在呼叫defineclass時會載入test.class到該classloader例項,此時再次呼叫test test=(test)clazz.newinstance()會產生型別轉換失敗的錯誤。

ps:在呼叫clazz.newinstance方法時,會使用classloader的loadclass方法,來載入類的關聯類。因此不同的classloader都有著自己的namespace。

類載入器ClassLoader

在專案中有時為了實現熱部署,需要動態載入指定路徑下的.class檔案 一般很少使用自定義的類載入器,而是用urlclassloader去載入指定路徑下的.class檔案 urlclassloader 預設是去載入jar包下的.class檔案 public static void main strin...

ClassLoader學習和類載入器載入Jar檔案

類載入器,參考 本文主要的實現的功能是把乙個jar檔案載入到classloader中 原理 把jar檔案載入成url,通過構造乙個urlclassloader,把原來的classloader和jar檔案合併 準備檔案 helloword.jar 其中內容為 package master.classl...

類載入ClassLoader和雙親委派機制

類載入器的發生時間是在類載入過程的載入階段發生的。1.bootstrap class loader會載入rt.jar下面的c 啟動類載入器 2.extension class loader會載入ext jar下面的 擴充套件類載入器 3.system class loader會載入使用者自定義的 應...