RTTI和反射小結
阿新 • • 發佈:2017-08-25
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和反射小結