1. 程式人生 > 其它 >反射和多型的實現原理詳解以及區別

反射和多型的實現原理詳解以及區別

在Java技術體系中所提供的能夠讓我們在執行時識別物件和類的型別資訊的方式,一共有兩種:即反射和多型關鍵技術RTTI。

多型和反射兩者的最大的共同點在於,他們都是執行時獲取程式資訊的技術。

多型

多型是面向物件程式設計裡面的概念,一個介面的多種不同的實現方式,即為多型。

多型體現在:只有在執行的時候才知道引用變數所指向的具體例項物件。且有三個必要的條件:

  • 繼承
  • 重寫/實現
  • 父類引用指向子類物件

java裡多型的具體用法

  • 子類繼承父類(extends)
  • 類實現介面(implements)

==========【要使用多型,在宣告物件時就應該遵循一條法則:宣告的總是父類型別或介面型別,而建立的是實際型別.】

反射

java程式在執行狀態中,對於任意一個類,都能夠在執行時知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

反射的實現原理

Class類與java.lang.reflect庫一起對反射的概念提供了技術支援。java.lang.reflect類庫包含了Field類,Method類以及Constructor類。這些類用來表示未知類裡對應的成員。Class類提供了獲取getFields()getMethods()getConstructors()等方法,而這些方法的返回值型別就定義在java.lang.reflect

當中。

反射機制並沒有什麼神奇之處,當通過反射與一個未知型別的物件打交道時,JVM只是簡單地檢查這個物件,看它屬於哪個特定的類,然後再通過拿到的某一個類的全限定名去找這個類的Class檔案 。因此,那個類的.class對於JVM來說必須是可獲取的,要麼在本地機器上,要麼從網路獲取。

  • RTTI,編譯器在編譯時開啟和檢查.class檔案
  • 反射,執行時開啟和檢查.class檔案

java虛擬機器幫我們生成了類的class物件,而通過類的全限定名,我們可以去獲取這個類的位元組碼.class檔案,然後再獲取這個類對應的class物件,再通過class物件提供的方法結合類Method,Filed,Constructor,就能獲取到這個類的所有相關資訊. 獲取到這些資訊之後,就可以使用Constructor建立物件,用get和set方法讀取和修改與Field物件相關的欄位,用invoke方法呼叫與Method物件關聯的方法。

反射的應用

  1. Spring/Mybatis等框架,行內有一句這樣的老話:反射機制是Java框架的基石。最經典的就是xml的配置模式。
  2. JDBC 的資料庫的連線
  3. 動態生成物件,應用於工廠模式中. spring的bean容器也就是一個工廠
  4. jdk動態代理,利用反射獲取傳入介面的實現類
  5. 註解機制的實現,利用反射可以獲取每一個filed,Filed類提供了getDeclaredAnnotations方法以陣列形式返回這個欄位所有的註解....
  6. 編輯器程式碼自動提示的實現

反射的弊端

1.效能

反射包括了一些動態型別,所以 JVM 無法對這些程式碼進行優化。因此,反射操作的效率要比那些非反射操作低得多。我們應該避免在經常被 執行的程式碼或對效能要求很高的程式中使用反射。

2.安全

使用反射技術要求程式必須在一個沒有安全限制的環境中執行。如果一個程式必須在有安全限制的環境中執行,如 Applet,那麼這就是個問題了。

3.內部暴露

由於反射允許程式碼執行一些在正常情況下不被允許的操作(比如訪問私有的屬性和方法),所以使用反射可能會導致意料之外的副作用--程式碼有功能上的錯誤,降低可移植性。反射程式碼破壞了抽象性,因此當平臺發生改變的時候,程式碼的行為就有可能也隨著變化。

4.喪失了編譯時型別檢查的好處,包括異常檢查。如果程式企圖用反射去呼叫不存在或者不可訪問方法,在執行時將會失敗。

反射相關類

Class類

Field類

欄位類,我們可以通過一個類的Class物件獲取其Field類的物件,然後java當中提供了這個Field類來提供反射獲取欄位的相關資訊,以及進行一些操作。

Method類

即方法類,我們可以通過一個類的Class物件獲取其Method類的一個例項物件,並且使用獲得的Method物件去獲取這個方法的相關資訊,以及呼叫這個方法的功能。

反射和多型的區別

  • 同為執行時獲取資訊,多型獲取的資訊僅僅在於確定方法應用所指向的實際物件。而反射在於獲取一個類的所用資訊。
  • 多型是一種面嚮物件語言的機制。而反射技術是java提供的專門用於動態獲取類的資訊的技術。