淺談Java —— Reflection機制(一)

_Hotown發表於2019-02-25

概述

反射(Reflection)是Java 程式開發語言的特徵之一,它允許執行中的 Java 程式獲取自身的資訊,並且可以操作類或物件的內部屬性。

這就意味著,Java語言在執行時,擁有自觀能力,通過這種能力可以瞭解自身,以便為下一步操作做準備。

反射的核心是JVM在執行時才動態載入類或呼叫方法/訪問屬性,它不需要事先(寫程式碼的時候或編譯期)知道執行物件是誰。

接下來從幾個方面來探討一下Java的反射機制

  • 反射的用途

  • 反射的基本運用

反射的用途

Spring的核心部分,IOC的實現就是通過反射機制實現的。

在例項化一個類的時候,Spring會通過反射機制呼叫類的set方法將事先儲存在HashMap中的類屬性注入到類中。(借鑑自t_man的專欄

因為初次接觸,這裡就不再例舉反射機制的其他用途,留待後續補充……

反射的基本運用

Java的反射機制藉助於4個類:class,Constructor,Field,Method

在Java執行環境中,對於任何一個類,可以獲取到這個類的屬性和方法。這樣動態獲取類資訊以及動態呼叫物件的方法的功能源於Java Refleciton

Java反射機制主要提供了

在執行時判斷任意一個物件所屬的類(class)
在執行時構造任意一個類的物件(Constructor)
在執行時判斷任意一個類所具有的成員變數和方法(Field)
在執行時呼叫任意一個物件的方法(Method)
複製程式碼
  1. 得到構造器

    Constructor getConstructor(Class[] params) -- 獲得使用特殊的引數型別的公共建構函式, 
     
    Constructor[] getConstructors() -- 獲得類的所有公共建構函式 
     
    Constructor getDeclaredConstructor(Class[] params) -- 獲得使用特定引數型別的建構函式(與接入級別無關) 
     
    Constructor[] getDeclaredConstructors() -- 獲得類的所有建構函式(與接入級別無關)
    複製程式碼
  2. 獲得欄位資訊

    Field getField(String name) -- 獲得命名的公共欄位
    Field[] getFields() -- 獲得所有公共欄位
    Field getDeclaredField(String name) -- 獲得類宣告的命名的欄位
    Field[] getDeclaredFields() -- 獲得類宣告的所有欄位
    複製程式碼
  3. 獲得方法資訊

    Method getMethod(String name, Class[] params) -- 使用特定的引數型別,獲得命名的公共方法 
     
    Method[] getMethods() -- 獲得類的所有公共方法 
     
    Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的引數型別,獲得類宣告的命名的方法 
     
    Method[] getDeclaredMethods() -- 獲得類宣告的所有方法
    
    複製程式碼

相關文章