1. 程式人生 > >weblogic與Java類載入器原理試驗解析

weblogic與Java類載入器原理試驗解析

Public class Test1{  
  Public static void main(String[] arg){  
	  System.out.println(Test1.class.getClassLoader());  
	  Test2 t2 = new Test2();  
	  T2.print();  
  }  
} 
檔案: Test2.java
Public 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  


-----------------------------------引用結束,感謝作者哈!----------------------------------