數據加載中……
          幾種類加載方式的區別
          虛擬機加載類的途徑:

          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,它們分屬于不同的異常/錯誤分支。

          -----------------------------

          對象實例化方式:
          1、new Dog();
          2、clazz.newInstance();或者clazz.getConstructor(...).newInstance(...);
          3、Object.clone();//通過本地方法進行復制
          4、反序列化 

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

          主站蜘蛛池模板: 南京市| 双流县| 博乐市| 大宁县| 四川省| 鹰潭市| 汝城县| 巴中市| 麟游县| 和平区| 缙云县| 呼伦贝尔市| 信阳市| 龙口市| 建宁县| 通城县| 庆安县| 富蕴县| 舟曲县| 灌阳县| 肇源县| 当雄县| 班戈县| 科技| 宕昌县| 黑水县| 隆化县| 浦县| 兴安盟| 泰安市| 海原县| 仙居县| 鹤山市| 六枝特区| 石家庄市| 新民市| 阳泉市| 宣武区| 清河县| 柞水县| 望谟县|