概述
反射(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)
複製程式碼
-
得到構造器
Constructor getConstructor(Class[] params) -- 獲得使用特殊的引數型別的公共建構函式, Constructor[] getConstructors() -- 獲得類的所有公共建構函式 Constructor getDeclaredConstructor(Class[] params) -- 獲得使用特定引數型別的建構函式(與接入級別無關) Constructor[] getDeclaredConstructors() -- 獲得類的所有建構函式(與接入級別無關) 複製程式碼
-
獲得欄位資訊
Field getField(String name) -- 獲得命名的公共欄位 Field[] getFields() -- 獲得所有公共欄位 Field getDeclaredField(String name) -- 獲得類宣告的命名的欄位 Field[] getDeclaredFields() -- 獲得類宣告的所有欄位 複製程式碼
-
獲得方法資訊
Method getMethod(String name, Class[] params) -- 使用特定的引數型別,獲得命名的公共方法 Method[] getMethods() -- 獲得類的所有公共方法 Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的引數型別,獲得類宣告的命名的方法 Method[] getDeclaredMethods() -- 獲得類宣告的所有方法 複製程式碼