《java編程思想——第十四章(類型信息)》

類型信息

運行時類型信息使得你可以在程序運行時發現和使用類型信息。

14.1 爲什麼需要RTTI

RTTI:在運行時,識別一個對象的類型。
使用RTTI可以確定引用的確切類型。

14.2 Class對象##

Class對象記錄着運行時的類型信息。

Class c = Class.forName(“Gum”);可以獲得Class引用。
c.getInterfaces()獲取接口
c.getSuperclass()獲取父類
c.newInstance()獲取實例

  1. 類字面量
    類名.class也可以獲得Class對象的引用。
    當使用".class"來創建Class對象引用時,不會自動初始化改Class對象。
    初始化被延遲到了對靜態方法或非常數靜態域首次引用時執行。
  2. 泛型的Class引用
    當將泛型語法作用於Class對象時,newInstance()將返回改對象的確切
    類型。
  3. 新的轉型語法
    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文件。

  1. 類方法提取器
    Class的getMethods()方法和getConstructors()分別可以返回類的方法,參數,返回值等信息。

14.7 動態代理##

代理是基本設計模式之一。
Proxy.newProxyInstance(classLoader,interface.class,invocationHandler)可以創建動態代理.

14.8空對象##

14.9 接口與類型信息##

interface關鍵字的一種重要目標就是允許程序員隔離構件,降低耦合性。通過接口可以實現這一目標,但是通過類型信息,這種耦合性還是可以傳播出去。
通過反射可以調用所有方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章