類加載的三種方式


類加載分為動態加載靜態加載動態加載是從外存儲器中加載類,一般類加載機制分析的也是動態加載。而靜態加載本質上是從內存中創建類的實例對象,此時類已經被加載到內存中。


一.靜態加載

通過new關鍵字來創建Test的實例對象。


 

二.動態加載

1.通過Class.forName()來加載類,然后調用類的newInstance()方法實例化對象。

 

2.通過類加載器的loadClass()方法來加載類,然后調用類的newInstance()方法實例化對象。


這里有幾個需要比較的地方:

1.通過new關鍵字實例化類的對象和通過Class.forName()加載類是當前類加載器,即this.getClass.getClassLoader,只能在當前類路徑或者導入的類路徑下尋找類。而用指定的classLoader來加載類可以從當前路徑外尋找類,這里的classLoader甚至可以用戶自定義。

2.我們知道類加載機制的三個過程主要是加載-->連接-->初始化。Class.forName()實際調用的是Class.forName(className,true,this.getClass.getClassLoader),第二個參數表示加載完后是否立即初始化,第三個參數即前文提到的表示是當前類加載器。classLoader.loadClass()實際調用的是classLoader.loadClass(className,false),第二個參數表示加載完成后是否連接,即用此方法加載類,加載完成后不會去初始化,而用Class.forName()加載類加載完成后可以被初始化。所以有些類如果加載完成后需要立即被初始化則必須使用Class.forName()。例如在加載數據庫驅動時,一般用Class.forName("com.mysql.jdbc.Driver")。這是因為該驅動有一個在靜態代碼塊中注冊驅動的過程,所以需要被初始化。

3.有兩個異常

靜態加載類時出現的一般是NoClassDefFoundError。

動態加載類時出現的一般是ClassNotFoundException。

這兩者經常被用來比較,其實區別很大。NoClassDefFoundError是錯誤,不方便被捕捉也不需要被捕捉,不應該嘗試從error中恢復程序。他是由於在使用new關鍵字實例化類的對象時,在內存中找不到對象了,一般比較少見,在運行時發生,即編譯時可以找到類運行時卻找不到了。而ClassNotFoundException是異常,是可以被捕捉的,應該捕捉並處理嘗試恢復程序。這是由於利用類名動態加載類的時候,在外存儲器類路徑下找不到該類或者其依賴的jar包,還有一個導致其的原因是在同一個包中同一個類被不同的類加載器加載了兩遍。
————————————————

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM