weblogic與Java類載入器原理試驗解析
阿新 • • 發佈:2019-02-13
Public class Test1{
Public static void main(String[] arg){
System.out.println(Test1.class.getClassLoader());
Test2 t2 = new Test2();
T2.print();
}
}
檔案: Test2.javaPublic class Test2{ Public void prin(){ System.out.println(this.getClass().getClassLoader()); } }
這兩個類的作用就是打印出載入它們的類裝載器是誰,將這兩個檔案儲存到d:\my目錄下,編譯後,我們
在複製兩份,分別置於jdk1.4\jre\classes下(注意,剛開始我們的系統下沒有此目錄,需自己建立)與
jdk1.4\jre\lib\ext\classes下(同樣注意,開始我們的系統下也沒此目錄,手工建立),然後切換到d:\my
目錄下開始測試,
測試一:
<JRE所在目錄>\classes下
Test1.class
Test2.class
<JRE所在目錄>\lib\ext\classes下
Test1.class
Test2.class
D:\my下
Test1.class
Test2.class
dos下輸入執行命令,結果如下:
D:\my>java Test1
Null
Null
D:\my>
從輸出結果我們可以看出:
當AppClassLoader要載入Test1.class時,先請其Parent,也就是ExtClassLoader來載入,
而ExtclassLoader又請求其Parent,即Bootstrap Loader來載入Test1.class.
由於<JRE所在目錄>\Classes目錄為Bootstrap Loader的搜尋路徑之一,所以Bootstrap Loader找到了
Test1.class,因此將它載入,接著在Test1.class之內有載入Test2.class的需求,由於Test1.class是由
Bootstrap Loader所載入,所以Test2.class內定是由Bootstrap Loader根據其搜尋路徑來找,
因Test2.class也位於Bootstrap Loader可以找到的路徑下,所以也被載入了,最後我們看到Test1.class
與Test2.class都是由Bootstrap Loader(null)載入。
測試二:
<JRE所在目錄>\classes下
Test1.class
<JRE所在目錄>\lib\ext\classes下
Test1.class
Test2.class
D:\my下
Test1.class
Test2.class
dos下輸入執行命令,結果如下:
D:\my>java Test1
Null
Exception in thread “main” java.lang.NoClassdefFoundError:Test2 at Test1.main。。。
D:\my>
從輸出結果我們可以看出:
當AppClassLoader要載入Test1.class時,先請其Parent,也就是ExtClassLoader來載入,
而ExtclassLoader又請求其Parent,即Bootstrap Loader來載入Test1.class.
由於 <JRE所在目錄>\Classes目錄為Bootstrap Loader的搜尋路徑之一,所以Bootstrap Loader找到了
Test1.class,因此將它載入,接著在Test1.class之內有載入Test2.class的需求,由於Test1.class是由
Bootstrap Loader所載入,所以Test2.class內定是由Bootstrap Loader根據其搜尋路徑來找,
但是因為Bootstrap Loader根本找不到Test2.class(被我們刪除),而Bootstrap Loader又沒有Parent,
所以無法載入Test2.class.最後我們看到Test1.class是由Bootstrap Loader(null)載入,而Test2.class則無法載入
測試三
<JRE所在目錄>\classes下
Test2.class
<JRE所在目錄>\lib\ext\classes下
Test1.class
Test2.class
D:\my下
Test1.class
Test2.class
dos下輸入執行命令,結果如下:
D:\my>java Test1
。。。ExtClassLoader。。。
Null
D:\my>
從輸出結果我們可以看出:
當AppClassLoader要載入Test1.class時,先請其Parent,也就是ExtClassLoader來載入,
而ExtclassLoader又請求其Parent,即Bootstrap Loader來載入Test1.class.
但是Bootstrap Loader無法在其搜尋路徑下找到Test1.class(被我們刪掉了),所以ExtClassLoader只得
自己搜尋,因此ExtClassLoader在其搜尋路徑 <JRE所在目錄>\lib\ext\classes下找到了Test1.class,因
此將它載入,接著在Test1.class之內有載入Test2.class的需求,由於Test1.class是由ExtClassLoader
所載入,所以Test2.class內定是由ExtClassLoader根據其搜尋路徑來找,但是因為ExtClassLoader有
Parent,所以先由Bootstrap Loader幫忙尋找,Test2.class位於Bootstrap Loader可以找到的路徑下,所
以被Bootstrap Loader載入了.最後我們看到Test1.class是由ExtClassLoader載入,而Test2.class則是由
Bootstrap Loader(null)載入
瞭解了以上規則,請朋友們自行分析以下場景的執行結果
測試四:
<JRE所在目錄>\classes下
<JRE所在目錄>\lib\ext\classes下
Test1.class
Test2.class
D:\my下
Test1.class
Test2.class
測試五:
<JRE所在目錄>\classes下
<JRE所在目錄>\lib\ext\classes下
Test1.class
D:\my下
Test1.class
Test2.class
測試六:
<JRE所在目錄>\classes下
<JRE所在目錄>\lib\ext\classes下
Test2.class
D:\my下
Test1.class
Test2.class
測試七:
<JRE所在目錄>\classes下
<JRE所在目錄>\lib\ext\classes下
D:\my下
Test1.class
Test2.class
-----------------------------------引用結束,感謝作者哈!----------------------------------