RTTI 和 Reflection

outline
1)  什麼是RTTI?
2)RTTI應用場景?(什麼情況下要直接使用RTTI,什麼機制是基於RTTI實現的即間接使用了RTTI)
3)  直接使用RTTI:Class<?>,如何獲得類的Class對象
 
3)Reflection和RTTI的區別 運行時定位class (運行時定位class ;編譯時就要定位class)
4)Reflection機制的使用包括Class和Reflection API
5)  Reflection機制支持了哪些場景框架、機制?
 
------------------------------------splitter----------------------------
 
什麼是RTTI
在運行時識別一個對象的類型,即RTTI的基本功能
 
提出RTTI功能需求場景
舉例:
List<Shape> shapeList = Arrays.asList(new Circle(), new Square(), new Triangle());
容器把其所容納的元素都當做Object持有,在取出每個元素時,轉換成Shape;
這個例子中RTTI類型轉換不徹底,Object只被轉化成Shape,而不是具體的Circle等。這是因爲編譯時,通過容器和泛型系統保證集合中元素中時Shape類型,僅此而已;所以在運行時只會完成類型轉換到Shape。
如果有進一步需求,明確集合元素Shape類型更加進一步的類型Circle、Square、Triangle.......這個也需要RTTI機制。
 
另外,總結來說:
1)傳統類型轉換,由RTTI確保類型轉換的正確性;如”(Shape)“,如果執行了一個錯誤的類型轉換會拋出”ClassCastException“
2)獲取類Class對象,通過這個對象獲取運行時需要的類型信息
3)instanceof關鍵字也需要RTTI支持(Class.isInstance方法)
 
RTTI機制原理
Java中使用每個類的Class對象來保存運行時類型信息的。
每個新類編譯後,其對應產生一個Class對象,被一同保存在對應的.class文件中。
類加載器在加載這個類的同時會創建這個類的Class對象。
 
Java是動態加載類的,即只有在需要時才加載;對比C++是靜態加載的,即程序運行開始就將所有類加載。
 
Java類動態加載的時機:
1)對該類的第一次靜態成員的訪問
2)調用該類的構造方法時
 
如何獲取一個類的Class對象?
1)Class.forName()
2)某個類對象實例getClass()方法【定義在Object類中】
3)某個類的靜態成員Foo.class
 
java.lang.Class<T>
Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的。
1)Class<?> Class<? extends > Class<? super >用法
2)Class.isInstance
3)  instanceof Class對象比較區別 instanceof 可以體現繼承層次 Derived instance of Base[TRUE] Derived.class == Base.class[FALSE]
 
-------------------------------------------------------------------splitter----------------------------------------------
Reflection機制的需求
RTTI可以再運行時提供類型信息,但是所涉及的類型信息必須在程序編譯時就已知了(即在編譯時就可以定位到那個類的class文件了,儘管RTTI並不是在那個時候去定位的)(或者說編譯器要提前知道所有可能應用於RTTI的類)
在分佈式系統(RMI/RPC等調用)中時無法做到的;那麼有沒有什麼辦法解決呢?——Reflection
 
RTTI和Reflection區別
RTTI,在編譯時就需要定位和檢查.class文件,在運行時動態加載類同時創建各個類的Class對象以支持RTTI;
Reflection,只需要在運行時類的動態加載時可以定位到那個.class文件即可。
 
因爲這個原因所以:如果需要根據Reflection獲取的類,要創建該類型的對象實例、訪問成員等,
需要另外一套機制支持即Java Reflection API;
而無法直接new Foo() 或者Foo.xxx,因爲Reflection獲取的類型信息在編譯時時不可見的,這種代碼無法編譯通過
 
 
Relfection的核心
1)Class對象
2)Java Reflection API
 
Reflection支持了哪些機制和框架功能
.......
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章