類型信息
運行時類型信息使得你可以在程序運行時發現和使用類型信息。
14.1 爲什麼需要RTTI
RTTI:在運行時,識別一個對象的類型。
使用RTTI可以確定引用的確切類型。
14.2 Class對象##
Class對象記錄着運行時的類型信息。
Class c = Class.forName(“Gum”);可以獲得Class引用。
c.getInterfaces()獲取接口
c.getSuperclass()獲取父類
c.newInstance()獲取實例
- 類字面量
類名.class也可以獲得Class對象的引用。
當使用".class"來創建Class對象引用時,不會自動初始化改Class對象。
初始化被延遲到了對靜態方法或非常數靜態域首次引用時執行。 - 泛型的Class引用
當將泛型語法作用於Class對象時,newInstance()將返回改對象的確切
類型。 - 新的轉型語法
cast()語法接受參數對象,並將其轉型爲Class引用的類型。
14.3類型轉換前先做檢查##
RTTI的形式包括:
1)傳統的類型轉換,如"(Shape)".
2)代表對象類型的Class對象。
3)instanceof告訴是不是某個特定類型的實例。
14.4 註冊工廠##
工廠方法設計模式:將對象的創建工作交給類自己去完成。
14.5 instanceof與Class的等價性##
instanceof保持了類型的概念,它指的是“是這個類或這個類的派生了嗎”
Class 沒有考慮繼承,指的是確實類型,是或者不是。
14.6 反射:運行時的類信息##
如果不知道某個類的確切信息RTTI可以告訴你,但是有個限制:這個類型在編譯時期必須已知。
RTTI與反射之間的區別在於:對於RTTI來說,編輯器在編譯時打開和檢查.class文件;反射機制來說,.class文件在編譯時期是不可獲取的,所以是咋運行時打開和檢查.class文件。
- 類方法提取器
Class的getMethods()方法和getConstructors()分別可以返回類的方法,參數,返回值等信息。
14.7 動態代理##
代理是基本設計模式之一。
Proxy.newProxyInstance(classLoader,interface.class,invocationHandler)可以創建動態代理.
14.8空對象##
14.9 接口與類型信息##
interface關鍵字的一種重要目標就是允許程序員隔離構件,降低耦合性。通過接口可以實現這一目標,但是通過類型信息,這種耦合性還是可以傳播出去。
通過反射可以調用所有方法。