<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數據加載中……

    淺議類型識別與反射機制

        作者:Flyingis

        運行時類型識別
    (Run-time Type Identification, RTTI)主要有兩種方式,一種是我們在編譯時和運行時已經知道了所有的類型,另外一種是功能強大的“反射”機制。

           要理解RTTIJava中的工作原理,首先必須知道類型信息在運行時是如何表示的,這項工作是由“Class對象”完成的,它包含了與類有關的信息。類是程序的重要組成部分,每個類都有一個Class對象,每當編寫并編譯了一個新類就會產生一個Class對象,它被保存在一個同名的.class文件中。在運行時,當我們想生成這個類的對象時,運行這個程序的Java虛擬機(JVM)會確認這個類的Class對象是否已經加載,如果尚未加載,JVM就會根據類名查找.class文件,并將其載入,一旦這個類的Class對象被載入內存,它就被用來創建這個類的所有對象。一般的RTTI形式包括三種:

    1.       傳統的類型轉換。如“(Apple)Fruit”,由RTTI確保類型轉換的正確性,如果執行了一個錯誤的類型轉換,就會拋出一個ClassCastException異常。

    2.       通過Class對象來獲取對象的類型。如

    Class c = Class.forName(“Apple”);

    Object o = c.newInstance();

    3.       通過關鍵字instanceofClass.isInstance()方法來確定對象是否屬于某個特定類型的實例,準確的說,應該是instanceof / Class.isInstance()可以用來確定對象是否屬于某個特定類及其所有基類的實例,這和equals() / ==不一樣,它們用來比較兩個對象是否屬于同一個類的實例,沒有考慮繼承關系。

     

    反射

           如果不知道某個對象的類型,可以通過RTTI來獲取,但前提是這個類型在編譯時必須已知,這樣才能使用RTTI來識別。即在編譯時,編譯器必須知道所有通過RTTI來處理的類。

    使用反射機制可以不受這個限制,它主要應用于兩種情況,第一個是“基于構件的編程”,在這種編程方式中,將使用某種基于快速應用開發(RAD)的應用構建工具來構建項目。這是現在最常見的可視化編程方法,通過代表不同組件的圖標拖動到圖板上來創建程序,然后設置構件的屬性值來配置它們。這種配置要求構件都是可實例化的,并且要暴露其部分信息,使得程序員可以讀取和設置構件的值。當處理GUI時間的構件時還必須暴露相關方法的細細,以便RAD環境幫助程序員覆蓋這些處理事件的方法。在這里,就要用到反射的機制來檢查可用的方法并返回方法名。Java通過JavaBeans提供了基于構件的編程架構。

           第二種情況,在運行時獲取類的信息的另外一個動機,就是希望能夠提供在跨網絡的遠程平臺上創建和運行對象的能力。這被成為遠程調用(RMI),它允許一個Java程序將對象分步在多臺機器上,這種分步能力將幫助開發人員執行一些需要進行大量計算的任務,充分利用計算機資源,提高運行速度。

           Class支持反射,java.lang.reflect中包含了Field/Method/Constructor類,每個類都實現了Member接口。這些類型的對象都是由JVM在運行時創建的,用來表示未知類里對應的成員。如可以用Constructor類創建新的對象,用get()set()方法讀取和修改與Field對象關聯的字段,用invoke()方法調用與Method對象關聯的方法。同時,還可以調用getFields()getMethods()getConstructors()等方法來返回表示字段、方法以及構造器的對象數組。這樣,未知的對象的類信息在運行時就能被完全確定下來,而在編譯時不需要知道任何信息。

           另外,RTTI有時能解決效率問題。當程序中使用多態給程序的運行帶來負擔的時候,可以使用RTTI編寫一段代碼來提高效率。

    Happy Birthday to myself!

    posted on 2005-12-11 14:43 Flyingis 閱讀(2261) 評論(9)  編輯  收藏 所屬分類: JavaSE

    評論

    # re: 淺議類型識別與反射機制  回復  更多評論   

    Happy birthday to you and wish you have a nice day! Enjoy yourself!
    2005-12-11 16:31 | 非魚

    # re: 淺議類型識別與反射機制  回復  更多評論   

    Thanks:)
    2005-12-11 17:10 | Flyingis

    # re: 淺議類型識別與反射機制  回復  更多評論   

    Happy Birthday to you.
    2005-12-12 07:45 | licl

    # re: 淺議類型識別與反射機制  回復  更多評論   

    糾正一點錯誤觀點,RTTI 會帶來效率問題,其效率遠低于多態,相差可達2到3個數量級。

    多態,如 接口,重載。其效率除了靜態方法外是最高的。
    事實上多態涉及到了絕對多數的代碼:Java代碼中除了靜態方法和標記了 final 的方法(?,待做試驗)外,所有的普通方法全部是虛方法(多態)調用。

    祝你生日快樂。
    2005-12-12 13:46 | 笨笨

    # re: 淺議類型識別與反射機制  回復  更多評論   

    今年是本命年,謝謝各位!
    ----------
    笨笨的分析讓我學習不少。但是,在任何情況下RTTI的效率都會低于多態嗎?當在某種環境下多態產生了低效率時,采用RTTI是否是一種可行的解決方式?
    2005-12-12 15:20 | Flyingis

    # re: 淺議類型識別與反射機制  回復  更多評論   

    多態就是普通的Java 方法調用,效率不會低的。
    如果效率低,只能說:考慮改進算法或換JNI實現。
    2005-12-12 17:43 | 笨笨

    # re: 淺議類型識別與反射機制  回復  更多評論   

    THINKING IN JAVA中的東西。剛接觸的人STILL FAINT。。。
    2006-06-28 11:24 | Against

    # re: 淺議類型識別與反射機制  回復  更多評論   

    /*
    例,這和equals() / ==不一樣,它們用來比較兩個對象是否屬于同一個類的實例,沒有考慮繼承關系。
    */
    這句話有誤.
    2006-12-26 12:52 | John[匿名]

    # re: 淺議類型識別與反射機制  回復  更多評論   

    @John[匿名]
    謝謝提示,以前理解錯了。
    一個是值的比較,一個是內存地址比較。
    2006-12-28 16:21 | Flyingis
    主站蜘蛛池模板: 亚洲最大福利视频网站| 亚洲国产精品VA在线看黑人| 中文字幕无码亚洲欧洲日韩| 91麻豆最新在线人成免费观看 | 亚洲人色婷婷成人网站在线观看| 妇女自拍偷自拍亚洲精品| 国产真实伦在线视频免费观看| 亚洲av无一区二区三区| 蜜桃精品免费久久久久影院| 亚洲AV日韩AV一区二区三曲| 国产在线a不卡免费视频| 精品成人一区二区三区免费视频| 免费a级毛片大学生免费观看 | 青青草a免费线观a| 色老板亚洲视频免在线观| 成人免费看黄20分钟| 色欲aⅴ亚洲情无码AV| 亚洲国产精品无码久久久久久曰| 国产日韩久久免费影院| 亚洲AV无码不卡无码| 亚洲免费视频网址| 亚洲精品无码中文久久字幕| 国产又大又长又粗又硬的免费视频 | 亚洲视频在线播放| 成人免费一级毛片在线播放视频| 亚洲国产精品网站在线播放| 免费国产a国产片高清网站| 毛片基地看看成人免费| 中文字幕亚洲精品| 日韩免费无码一区二区视频 | 国产精品免费高清在线观看| 亚洲国语在线视频手机在线| 日韩成人免费视频播放| 一级有奶水毛片免费看| 亚洲一卡二卡三卡四卡无卡麻豆 | 久久不见久久见中文字幕免费| 免费在线人人电影网| 亚洲丝袜美腿视频| 在线免费观看韩国a视频| a级男女仿爱免费视频| 99999久久久久久亚洲|