Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
          數(shù)據(jù)加載中……

          ClassCastException深入分析

          作者:Flyingis

                ClassCastException
          JVM在檢測(cè)到兩個(gè)類型間轉(zhuǎn)換不兼容時(shí)引發(fā)的運(yùn)行時(shí)異常。此類錯(cuò)誤通常會(huì)終止用戶請(qǐng)求。在執(zhí)行任何子系統(tǒng)的應(yīng)用程序代碼時(shí)都有可能發(fā)生ClassCastException異常。通過轉(zhuǎn)換,可以指示Java編譯器將給定類型的變量作為另一種變量來處理。對(duì)基礎(chǔ)類型和用戶定義類型都可以轉(zhuǎn)換。Java語言規(guī)范定義了允許的轉(zhuǎn)換,其中大多數(shù)可在編譯時(shí)進(jìn)行驗(yàn)證。不過,某些轉(zhuǎn)換還需要運(yùn)行時(shí)驗(yàn)證。如果在此運(yùn)行時(shí)驗(yàn)證過程中檢測(cè)到不兼容,JVM就會(huì)引發(fā)ClassCastException異常。例如:

          Fruit f;

          Apple a = (Apple)f;

          當(dāng)出現(xiàn)下列情況時(shí),就會(huì)引發(fā)ClassCastException異常:

          1.        FruitApple類不兼容。當(dāng)應(yīng)用程序代碼嘗試將某一對(duì)象轉(zhuǎn)換為某一子類時(shí),如果該對(duì)象并非該子類的實(shí)例,JVM就會(huì)拋出ClassCastException異常。

          2.        FruitApple類兼容,但加載時(shí)使用了不同的ClassLoader。這是這種異常發(fā)生最常見的原因。在這里,需要了解一下什么是ClassLoader?


          ClassLoader

                   ClassLoader是允許JVM查找和加載類的一種Java類。JVM有內(nèi)置的ClassLoader。不過,應(yīng)用程序可以定義自定義的ClassLoader。應(yīng)用程序定義新的ClassLoader通常出于以下兩種原因:

          1.        自定義和擴(kuò)展JVM加載類的方式。例如,增加對(duì)新的類庫(網(wǎng)絡(luò)、加密文件等)的支持。

          2.        劃分JVM名稱空間,避免名稱沖突。例如,可以利用劃分技術(shù)同時(shí)運(yùn)行同一應(yīng)用程序的多個(gè)版本(基于空間的劃分)。此項(xiàng)技術(shù)在應(yīng)用服務(wù)器(WebLogic Server)內(nèi)的另一個(gè)重要用途是啟用應(yīng)用程序熱重新部署,即在不重新啟動(dòng)JVM的情況下啟動(dòng)應(yīng)用程序的新版本(基于時(shí)間的劃分)

          ClassLoader按層級(jí)方式進(jìn)行組織。除系統(tǒng)BootClassLoader外,其它ClassLoader都必須有父ClassLoader

          在理解類加載的時(shí)候,需要注意以下幾點(diǎn):

          1.        永遠(yuǎn)無法在同一ClassLoader中重新加載類?!盁嶂匦虏渴稹毙枰褂眯碌?/SPAN>ClassLoader。每個(gè)類對(duì)其ClassLoader的引用都是不可變的:this.getClass().getClassLoader()。

          2.        在加載類之前,ClassLoader始終會(huì)先詢問其父ClassLoader(委托模型)。這意味著將永遠(yuǎn)無法重寫“核心”類。

          3.        同級(jí)ClassLoader間互不了解。

          4.        由不同ClassLoader加載的同一類文件也會(huì)被視為不同的類,即便每個(gè)字節(jié)都完全相同。這是ClassCastException的一個(gè)典型原因。

          5.        可以使用Thread.setContextClassLoader(a)ClassLoader連接到線程的上下文。

          基于以上的基本原理,可以加深大家對(duì)ClassCastException的理解,和在碰到問題時(shí)提供一種解決問題的思路。

           

          參考文獻(xiàn):

          dev2dev專刊 2005 第二期

          j2sdk-1_5_0-doc

          posted on 2005-12-18 18:57 Flyingis 閱讀(28715) 評(píng)論(4)  編輯  收藏 所屬分類: JavaSE

          評(píng)論

          # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

          收藏:http://www.aygfsteel.com/ephon/archive/2006/01/17/28279.html
          有收獲。
          2006-01-17 10:31 | NsGFr

          # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

          Thanks,解決了一個(gè)bug
          2006-01-24 10:31 | Sunny

          # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

          ClassLoader
          還是不懂

          # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

          android培訓(xùn)知識(shí)
          2012-08-08 09:07 | 鄭昌奮
          主站蜘蛛池模板: 兰溪市| 喀什市| 库尔勒市| 陵川县| 中山市| 晋江市| 永宁县| 重庆市| 大连市| 桃江县| 青龙| 珲春市| 清镇市| 行唐县| 东海县| 龙岩市| 新泰市| 荥阳市| 江西省| 桃源县| 兰考县| 溧阳市| 穆棱市| 瓦房店市| 运城市| 娱乐| 达州市| 邹平县| 正镶白旗| 海林市| 大方县| 伊春市| 信宜市| 安溪县| 清涧县| 安康市| 鹰潭市| 汶上县| 桃源县| 宝兴县| 拜城县|