幾種類(lèi)加載方式的區(qū)別
虛擬機(jī)加載類(lèi)的途徑:
1、Dog dog = new Dog();
這個(gè)動(dòng)作會(huì)導(dǎo)致常量池的解析,Dog類(lèi)被隱式裝載。
如果當(dāng)前ClassLoader無(wú)法找到Dog,則拋出NoClassDefFoundError。
2、Class clazz = Class.forName(“Dog”);
Object dog =clazz.newInstance();
通過(guò)反射加載類(lèi)型,并創(chuàng)建對(duì)象實(shí)例
如果無(wú)法找到Dog,則拋出ClassNotFoundException。
3、Class clazz = classLoader.loadClass(“Dog”);
Object dog =clazz.newInstance();
通過(guò)反射加載類(lèi)型,并創(chuàng)建對(duì)象實(shí)例
如果無(wú)法找到Dog,則拋出ClassNotFoundException。
那么,1和2和3究竟有什么區(qū)別呢?分別用于什么情況呢?
1和2使用的類(lèi)加載器是相同的,都是當(dāng)前類(lèi)加載器。(即:this.getClass.getClassLoader)。
3由用戶指定類(lèi)加載器。
如果需要在當(dāng)前類(lèi)路徑以外尋找類(lèi),則只能采用第3種方式。第3種方式加載的類(lèi)與當(dāng)前類(lèi)分屬不同的命名空間。
當(dāng)前類(lèi)加載器命名空間對(duì)其不可見(jiàn)。當(dāng)然,如果被加載類(lèi)的超類(lèi)對(duì)于當(dāng)前類(lèi)命名空間可見(jiàn)的話,則可以進(jìn)行強(qiáng)制轉(zhuǎn)型。
第1和第2種情況區(qū)別不大。如果,Dog類(lèi)在編譯時(shí)無(wú)法得到,則使用第2種方式。
另外,第1種和第2種都會(huì)導(dǎo)致類(lèi)被初始化,即:執(zhí)行類(lèi)的靜態(tài)初始化語(yǔ)句,而第3種情況不會(huì)。
另外注意,第1種拋出Error,第2、3種拋出Exception,它們分屬于不同的異常/錯(cuò)誤分支。
-----------------------------
對(duì)象實(shí)例化方式:
1、new Dog();
2、clazz.newInstance();或者clazz.getConstructor(...).newInstance(...);
3、Object.clone();//通過(guò)本地方法進(jìn)行復(fù)制
4、反序列化
1、Dog dog = new Dog();
這個(gè)動(dòng)作會(huì)導(dǎo)致常量池的解析,Dog類(lèi)被隱式裝載。
如果當(dāng)前ClassLoader無(wú)法找到Dog,則拋出NoClassDefFoundError。
2、Class clazz = Class.forName(“Dog”);
Object dog =clazz.newInstance();
通過(guò)反射加載類(lèi)型,并創(chuàng)建對(duì)象實(shí)例
如果無(wú)法找到Dog,則拋出ClassNotFoundException。
3、Class clazz = classLoader.loadClass(“Dog”);
Object dog =clazz.newInstance();
通過(guò)反射加載類(lèi)型,并創(chuàng)建對(duì)象實(shí)例
如果無(wú)法找到Dog,則拋出ClassNotFoundException。
那么,1和2和3究竟有什么區(qū)別呢?分別用于什么情況呢?
1和2使用的類(lèi)加載器是相同的,都是當(dāng)前類(lèi)加載器。(即:this.getClass.getClassLoader)。
3由用戶指定類(lèi)加載器。
如果需要在當(dāng)前類(lèi)路徑以外尋找類(lèi),則只能采用第3種方式。第3種方式加載的類(lèi)與當(dāng)前類(lèi)分屬不同的命名空間。
當(dāng)前類(lèi)加載器命名空間對(duì)其不可見(jiàn)。當(dāng)然,如果被加載類(lèi)的超類(lèi)對(duì)于當(dāng)前類(lèi)命名空間可見(jiàn)的話,則可以進(jìn)行強(qiáng)制轉(zhuǎn)型。
第1和第2種情況區(qū)別不大。如果,Dog類(lèi)在編譯時(shí)無(wú)法得到,則使用第2種方式。
另外,第1種和第2種都會(huì)導(dǎo)致類(lèi)被初始化,即:執(zhí)行類(lèi)的靜態(tài)初始化語(yǔ)句,而第3種情況不會(huì)。
另外注意,第1種拋出Error,第2、3種拋出Exception,它們分屬于不同的異常/錯(cuò)誤分支。
-----------------------------
對(duì)象實(shí)例化方式:
1、new Dog();
2、clazz.newInstance();或者clazz.getConstructor(...).newInstance(...);
3、Object.clone();//通過(guò)本地方法進(jìn)行復(fù)制
4、反序列化
posted on 2008-11-25 14:38 flyleer 閱讀(1037) 評(píng)論(0) 編輯 收藏