運行時類型識別(Run-timeTypeIdentification,RTTI)主要有兩種方式,壹種是我們在編譯時和運行時已經知道了所有的類型,另外壹種是功能強大的“反射”機制。
要理解RTTI在Java中的工作原理,首先必須知道類型信息在運行時是如何表示的,這項工作是由“Class對象”完成的,它包含了與類有關的信息。類是程序的重要組成部分,每個類都有壹個Class對象,每當編寫並編譯了壹個新類就會產生壹個Class對象,它被保存在壹個同名的.class文件中。在運行時,當我們想生成這個類的對象時,運行這個程序的Java虛擬機(JVM)會確認這個類的Class對象是否已經加載,如果尚未加載,JVM就會根據類名查找.class文件,並將其載入,壹旦這個類的Class對象被載入內存,它就被用來創建這個類的所有對象。壹般的RTTI形式包括三種:
1.傳統的類型轉換。如“(Apple)Fruit”,由RTTI確保類型轉換的正確性,如果執行了壹個錯誤的類型轉換,就會拋出壹個ClassCastException異常。
2.通過Class對象來獲取對象的類型。如
Classc=Class.forName(“Apple”);
Objecto=c.newInstance();
3.通過關鍵字instanceof或Class.isInstance()方法來確定對象是否屬於某個特定類型的實例,準確的說,應該是instanceof/Class.isInstance()可以用來確定對象是否屬於某個特定類及其所有基類的實例,這和equals()/==不壹樣,它們用來比較兩個對象是否屬於同壹個類的實例,沒有考慮繼承關系。
反射
如果不知道某個對象的類型,可以通過RTTI來獲取,但前提是這個類型在編譯時必須已知,這樣才能使用RTTI來識別。即在編譯時,編譯器必須知道所有通過RTTI來處理的類。
使用反射機制可以不受這個限制,它主要應用於兩種情況,第壹個是“基於構件的編程”,在這種編程方式中,將使用某種基於快速應用開發(RAD)的應用構建工具來構建項目。這是現在最常見的可視化編程方法,通過代表不同組件的圖標拖動到圖板上來創建程序,然後設置構件的屬性值來配置它們。這種配置要求構件都是可實例化的,並且要暴露其部分信息,使得程序員可以讀取和設置構件的值。當處理GUI時間的構件時還必須暴露相關方法的細細,以便RAD環境幫助程序員覆蓋這些處理事件的方法。在這裏,就要用到反射的機制來檢查可用的方法並返回方法名。Java通過JavaBeans提供了基於構件的編程架構。
第二種情況,在運行時獲取類的信息的另外壹個動機,就是希望能夠提供在跨網絡的遠程平臺上創建和運行對象的能力。這被成為遠程調用(RMI),它允許壹個Java程序將對象分步在多臺機器上,昌平鎮java培訓認為這種分步能力將幫助開發人員執行壹些需要進行大量計算的任務,充分利用計算機資源,提高運行速度。