標籤:baidu 類型 oid 實現 form info method target ref
RTTI——運行時類型資訊(Run-Time Type Information),通過運行時類型資訊程式能夠使用基類的指標或引用來檢查這些指標或引用所指的對象的實際衍生類別型。
RTTI提供了以下兩個非常有用的操作符:
(1)typeId操作符,返回指標和引用所指的實際類型。
(2)dynamicCast操作符,將基類類型的指標或引用安全地轉換為衍生類別型的指標或引用。
程式碼範例:
1 public class Test1 { 2 public static void main(String[] args) { 3 4 // 把Square,Triangle對象放入List時會向上轉型為Shape 5 List<Shape> shapelist = Arrays.asList(new Shape(), new Square(), new Triangle()); 6 7 // 多態機制確保:Shape對象執行什麼樣的代碼由引用所指向的具體對象確定的 9 for (Shape shape : shapelist) {10 shape.draw();11 }12 }13 }
運行結果:
我是基類Shape的draw()方法!
我是子類Square的draw()方法!
我是子類Triangle的draw()方法!
總結:使用RTTI,可以查詢某個Shape引用所指向的對象的確切類型,然後選擇或者剔除個例。注意:RTTI允許通過匿名基類的引用來發現類資訊,但是要注意能夠使用多態機制實現的話,優先選用多態,否則在代碼開發以及維護過程中損失了很多多態機制的重要價值,必要的時候才會選用RTTI。
RTTI在java中的工作原理:
在java中有一種稱為Class對象的特殊對象,其包含與類有關的資訊,RTTI即是通過Class對象來執行的,每當編寫完了一個新類,然後進行編譯,java虛擬機器的“類載入器”子系統在運行程式時,在程式建立第一個對類的靜態成員的引用時,就會載入這個類,(說明:即使在構造器前沒有static關鍵字修飾,類的構造器也是類的靜態方法,因此使用new操作符建立類對象時也可以看做是對類的靜態成員的引用)。
獲得Class對象引用的方法:
1. 具體對象.getClass(): 持有此類型的對象時,可以使用此方法
2. Class.forName():不需要為了獲得Class引用而持有該類型的對象。但是需要注意:要放到try-catch子句中,因為如果找不到這個類,會拋出ClassNotFoundException。獲得對類的引用的同時進行初始化。
3. 類字面常量。在編譯期就會受到檢查,無需try-catch。使用類字面常量來獲得對類的引用不會引發初始化,初始化實現了“惰性”,即延遲到了對靜態方法(構造器隱式地是靜態)或者非常數靜態域進行首次引用時才執行。
package classInformation;class Candy { static { System.out.println("Loading Candy"); }}class Gum { static { System.out.println("Loading Gum"); } }class Cookie { static { System.out.println("Loading Cookie"); }}public class SweetShop { public static void main(String[] args) { // 第一種方式: Candy c= new Candy(); System.out.println("建立的對象Candy的資訊:"+c.getClass()); // 第二種方式: try { Class.forName("Gum"); // 好奇怪,上面為什麼沒有Loading Gum輸出呢? } catch(ClassNotFoundException e) { System.out.println("Couldn‘t find Gum"); } // 第三種方式: Class cc = Cookie.class;
System.out.println(Cookie.class); }}
程式運行結果:
Loading Candy
建立的對象Candy的資訊:class classInformation.Candy
Couldn‘t find Gum
class classInformation.Cookie
類型轉換:
1. 進行向下轉型,需要顯式的轉型操作;
2. 進行向上轉向,不需要顯式的轉型操作;
3. 關鍵字instanceof,可以用提問的方式使用它,去判斷某個對象到底是那個屬性類別型的執行個體;
反射:運行時的類資訊
Java通過javaBeans提供了基於構建的編程架構,通過“遠程方法調用(remote method invocation,RMI)”提供跨網路的遠程平台上建立和運行對象的方法,Class類和java.lang.reflection類庫一起對反射的概念進行了支撐,通過反射和一個未知類型的對象打交道,首先JVM檢查該對象屬於哪個類,通過類方法提取器獲得該類型的可用方法。
Java類型資訊