1. 程式人生 > >《java程式設計思想——第十四章(型別資訊)》

《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關鍵字的一種重要目標就是允許程式設計師隔離構件,降低耦合性。通過介面可以實現這一目標,但是通過型別資訊,這種耦合性還是可以傳播出去。
通過反射可以呼叫所有方法。