1. 程式人生 > >RTTI和反射小結

RTTI和反射小結

struct 打開 eof 識別 file 有關 strong .get 引用

Java有兩種方式讓我們在運行時識別對象和類的信息:1、“傳統的”RTTI,假定所有的類型編譯時已知;2、“反射”機制,允許在運行時發現和使用類的信息。

一、RTTI

RTTI(Run-Time Type Infomation),在運行時識別一個對象的信息。RTTI的形式有三種:

1、傳統的類型轉換

  如“Shape s=(Shape) new Circle()”,由RTTI確保類型轉換的正確性,如果執行了一個錯誤的類型轉換,就會拋出一個ClassCastException異常。

2、代表對象的類型的Class對象

  Class對象包含了與類有關的信息,每個類都有一個Class對象,每當編寫並編譯一個新類,就會產生一個Class對象(被保存在一個同名的.class文件中)。

  無論何時,要想在運行時使用類型信息,就必須首先獲取對恰當的Class對象的引用。有以下幾種方式可獲取:

  • Class.forName(),不需要為獲取Class引用而持有該類型的對象;
  • obj.getClass(),類Object方法,返回對象實際類型的Class引用;
  • Shape.class,類字面量,編譯時檢查,當使用“.class”來創建對Class對象的引用時,不會自動地初始化Class對象。

3、instanceof或者isInstance()

  考慮了繼承,表示“是否這個類,或者是否這個類的派生類”。

二、反射

Class類和java.lang.reflect類庫一起對反射的概念進行了支持。該類庫包含了Filed、Method和Constructor類(每個類都實現了Member接口),這些類型的對象是由JVM在運行創建的,用以表示未知類裏對應的成員。

主要的一些方法:getFileds()、getMethods()、getConstructors()和invoke()。

RTTI和反射的主要區別:對RTTI,編譯器在編譯時打開和檢查.class文件;對反射,在運行時打開和檢查.class文件。

RTTI和反射小結