數(shù)據(jù)加載中……
          幾種類(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、反序列化 

          posted on 2008-11-25 14:38 flyleer 閱讀(1037) 評(píng)論(0)  編輯  收藏

          主站蜘蛛池模板: 达拉特旗| 哈尔滨市| 衡山县| 西平县| 滁州市| 鹤壁市| 三原县| 榕江县| 乌鲁木齐县| 新河县| 莎车县| 五华县| 吉林市| 囊谦县| 宜章县| 大连市| 蓬溪县| 明溪县| 满城县| 连城县| 九台市| 长汀县| 南充市| 镶黄旗| 东至县| 乐山市| 天柱县| 镇坪县| 宽城| 富宁县| 织金县| 昂仁县| 巴中市| 雅江县| 天等县| 九龙城区| 三原县| 大悟县| 延吉市| 柯坪县| 丹寨县|