本文目錄一覽:
JAVA RTTI類型檢查主要是什麼?
在Java中,RTTI表現在:
1。Class對象,是RTTI的核心,每個類都有一個class對象。每當編寫並且編譯一個新類,就會產生一個Class對象(被保存在同名的.class文件當中)
2。instanceof 關鍵字用於檢查對象是不是某個特定類型的實例。
3。強制類型轉換,如:
Parent object = new Child();
Child child = (Child)object;
java的rtti與反射機制的區別和聯繫
反射機制並沒有什麼神奇之處。反射與RTTI的本質區別只是檢查一個類的.class文件的時機不同: 反射:.class 文件是在編譯時不可獲得的,所以在運行時打開和檢查未知類的.class文件從而變已知。 RTTI: .class 文件是在編譯時打開和檢查。
java中傳統的RTTI和反射的區別是什麼
在java中,有兩種RTTI的方式,一種是傳統的,即假設在編譯時已經知道了所有的類型;還有一種,是利用反射機制,在運行時再嘗試確定類型信息。
嚴格的說,反射也是一種形式的RTTI,不過,一般的文檔資料中把RTTI和反射分開,因為一般的,大家認為RTTI指的是傳統的RTTI,通過繼承和多態來實現,在運行時通過調用超類的方法來實現具體的功能(超類會自動實例化為子類,或使用instance of)。
傳統的RTTI有3種實現方式:
向上轉型或向下轉型(upcasting and downcasting),在java中,向下轉型(父類轉成子類)需要強制類型轉換
Class對象(用了Class對象,不代表就是反射,如果只是用Class對象cast成指定的類,那就還是傳統的RTTI)
instanceof或isInstance()
傳統的RTTI與反射最主要的區別,在於RTTI在編譯期需要.class文件,而反射不需要。傳統的RTTI使用轉型或Instance形式實現,但都需要指定要轉型的類型,比如:
public void rtti(Object obj){
Toy toy = Toy(obj); // Toy toy = Class.forName(“myblog.rtti.Toy”) // obj instanceof Toy}
注意其中的obj雖然是被轉型了,但在編譯期,就需要知道要轉成的類型Toy,也就是需要Toy的.class文件。
相對的,反射完全在運行時在通過Class類來確定類型,不需要提前加載Toy的.class文件。
反射
那到底什麼是反射(Reflection)呢?反射有時候也被稱為內省(Introspection),事實上,反射,就是一種內省的方式,Java不允許在運行時改變程序結構或類型變量的結構,但它允許在運行時去探知、加載、調用在編譯期完全未知的class,可以在運行時加載該class,生成實例對象(instance object),調用method,或對field賦值。這種類似於「看透」了class的特性被稱為反射(Reflection),我們可以將反射直接理解為:可以看到自己在水中的倒影,這種操作與直接操作源代碼效果相同,但靈活性高得多。
關於Java的反射API,沒必要去記憶,可以在任何JDK API中查詢即可
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/187852.html