java 類載入機制
阿新 • • 發佈:2019-02-10
1.java虛擬機器中可以有多個類載入器。
2.系統預設有三個類載入器,每個類載入器負責特定的位置的類載入任務,分別是:
BootStrap-->JRE/lib/rt.jar
ExtClassLoader-->JRE/lib/ext/*.jar
AppClassLoader-->CLASSPATH指定的所有的jar或者目錄
3.類載入器也是java類,顯然肯定有一個類載入器,不是java類,這個類載入器正是:BootStrap(執行在虛擬機器核心中,是用C++編寫的)
輸出的結果為:System.out.println("System類的類載入器是:"+System.class.getClassLoader());
因為System的載入器是BootStrap是由c++寫的,所以打印出來的是NULL
4.java虛擬機器中,所有的類載入器都採用的父子關係的樹形結構進行組織的,在例項化類載入器的時候,需要為其制定父類載入器或採用系統預設的類載入器作為父載入器。
5.類載入器,進行類載入的時候,會遵守委託機制:每個類載入器載入時,會先委託給父載入器,當父載入器未載入成功的時候,子載入器才會載入呢。當所有的祖宗載入器都沒有載入到該類的時候,回到發起者類載入器,如果還是載入不成功,則會丟擲異常:ClassNotFoundException.
6.自定義自己的類載入器的時候,需要繼承ClassLoader這個類,然後過載findClass方法,在這裡要關注這三個方法:loadClass()、findClass()、defineClass();
loadClass()這個方法進行載入的時候,會預設使用委託機制。
findClass方法會直接使用發起的類載入器進行載入。
defineClass 將類的位元組陣列轉化成某個類