RTTI 可查詢未知物件型別,但限制:型別必須編譯期已知。編譯器必須明確知道 RTTI 要處理的所有類別。
若取得不在程式空間內的物件參考怎麼辦?物件類別甚至編譯期不可用。例:從磁碟/網路取得位元組序列,被告知代表某類別。編譯器不知該類別,如何使用?
Class 類別擴展支援反射。新增庫 java.lang.reflect 含 Field、Method、Constructor(皆實作 Member 介面)。這些物件由 JVM 執行期建立,代表未知類別對應成員。可:
get()/set() 讀寫 Field 關聯欄位invoke() 呼叫 Method 關聯方法getFields()/getMethods()/getConstructors() 取得陣列匿名物件類別資訊可在執行期完整揭露,編譯期無需知悉任何資訊。
JVM 只是檢查物件、查詢所屬類別(同 RTTI)。之後 Class 物件必須載入(.class 檔在本機或網路可取得)。RTTI 與反射唯一差別:RTTI 編譯期開啟檢查 .class;反射由執行期環境開啟檢查。