反射(Reflection)是Java 程序開發語言的特徵之一,它容許運行中的 Java 程序獲取自身的信息,而且能夠操做類或對象的內部屬性。bash
這就意味着,Java語言在運行時,擁有自觀能力,經過這種能力能夠了解自身,以便爲下一步操做作準備。markdown
反射的核心是JVM在運行時才動態加載類或調用方法/訪問屬性,它不須要事先(寫代碼的時候或編譯期)知道運行對象是誰。函數
接下來從幾個方面來探討一下Java的反射機制oop
反射的用途spa
反射的基本運用.net
Spring的核心部分,IOC的實現就是經過反射機制實現的。code
在實例化一個類的時候,Spring會經過反射機制調用類的set方法將事先保存在HashMap中的類屬性注入到類中。(借鑑自t_man的專欄)orm
由於初次接觸,這裏就再也不例舉反射機制的其餘用途,留待後續補充……對象
Java的反射機制藉助於4個類:class,Constructor,Field,Method
blog
在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() -- 得到類聲明的全部方法
複製代碼