虛擬機加載類途徑

虛擬機加載類的途徑:

1、Dog dog = new Dog();
這個動作會導致常量池的解析,Dog類被隱式裝載。
如果當前ClassLoader無法找到Dog,則拋出NoClassDefFoundError。

2、Class clazz = Class.forName(“Dog”);
   Object dog =clazz.newInstance();
通過反射加載類型,並創建對象實例
如果無法找到Dog,則拋出ClassNotFoundException。

3、Class clazz = classLoader.loadClass(“Dog”);
   Object dog =clazz.newInstance();
通過反射加載類型,並創建對象實例
如果無法找到Dog,則拋出ClassNotFoundException。

那麼,1和2和3究竟有什麼區別呢?分別用於什麼情況呢?

1和2使用的類加載器是相同的,都是當前類加載器。(即:this.getClass.getClassLoader)。
3由用戶指定類加載器。

如果需要在當前類路徑以外尋找類,則只能採用第3種方式。第3種方式加載的類與當前類分屬不同的命名空間。
當前類加載器命名空間對其不可見。當然,如果被加載類的超類對於當前類命名空間可見的話,則可以進行強制轉型。

第1和第2種情況區別不大。如果,Dog類在編譯時無法得到,則使用第2種方式。

另外,第1種和第2種都會導致類被初始化,即:執行類的靜態初始化語句,而第3種情況不會。
另外注意,第1種拋出Error,第2、3種拋出Exception,它們分屬於不同的異常/錯誤分支。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章