Java反射機制

API:

內(nèi)容:

  1. 反射基礎(chǔ)+反射基本流程
  2. 反射可訪問的常用信息
  3. 通過反射訪問的構(gòu)造方法的使用
  4. 通過反射訪問的方法的使用
  5. 通過反射訪問的方法的使用
  6. 無恥的反射小demo

注:2.3.4.5 都是一些方法的例舉,歸納,可跳過。

1.反射基礎(chǔ)

Java 反射機制主要提供了以下功能,這些功能都位于java.lang.reflect包。

  • 運行時判斷任意一個對象所屬的類。
  • 運行時構(gòu)造任意一個類的對象。
  • 運行時判斷任意一個類所具有的成員變量和方法。
  • 運行時調(diào)用任意一個對象的方法。
  • 生成動態(tài)代理。
  • 可以獲取對象的私有屬性、調(diào)用對象的私有方法

反射使用基本步驟:

  • 獲取類對應(yīng)的Class對象
  • 使用Class對象獲取指定構(gòu)造方法對象Constructor、方法對象Method、成員對象Filed
  • 使用ConstructorMethod、Filed的實例對象構(gòu)造類的對象、調(diào)用類的方法、訪問/修改類的屬性
  1. 獲取類的Class對象:
  • Class.forName(ClassName)
  • 類名.class
  • 對象.getCalss()
  1. Constructor、Method、Field的獲取:
  • getXXXs():獲取此Class對象表示的公有XXX組成的數(shù)組
  • getXXX(...):根據(jù)參數(shù)獲取此Class對象表示的公有XXX
  • getDeclareXXXs():獲取此Class對象表示的所有XXX組成的數(shù)組
  • getDeclareXXX(...):獲取此Class對象表示的所有XXX

其中:XXX表示Constructor、Method、Field;如果是獲?。?gòu)造)方法,則參數(shù)為(構(gòu)造)方法參數(shù)類型的Class對象,如果是成員變量,則參數(shù)就是成員變量名。

  1. Constructor、Method、Field的使用(這里只是一個常用的使用舉例,還有很多使用見下表)
  • constructor .newInstance(...):構(gòu)造一個此Class對象的實例
  • method.invoke(Object obj , Object...args):調(diào)用obj對象的method方法,傳入?yún)?shù) args(可以為空)
  • field.get(Object obj)/set(Object obj, Object value):獲取obj對象的filed值或設(shè)置obj對象的filed值為value

2. 反射可訪問的常用信息

類型 訪問方法 返回值類型 說明
包路徑 getPackage() Package 對象 獲取該類的存放路徑
類名稱 getName() String 對象 獲取該類的名稱
繼承類 getSuperclass() Class 對象 獲取該類繼承的類
實現(xiàn)接口 getlnterfaces() Class 型數(shù)組 獲取該類實現(xiàn)的所有接口
構(gòu)造方法 getConstructors() Constructor 型數(shù)組 獲取所有權(quán)限為 public 的構(gòu)造方法
構(gòu)造方法 getDeclaredContxuectors() Constructor 對象 獲取當(dāng)前對象的所有構(gòu)造方法
方法 getMethods() Methods 型數(shù)組 獲取所有權(quán)限為 public 的方法
方法 getDeclaredMethods() Methods 對象 獲取當(dāng)前對象的所有方法
成員變量 getFields() Field 型數(shù)組 獲取所有權(quán)限為 public 的成員變量
成員變量 getDeclareFileds() Field 對象 獲取當(dāng)前對象的所有成員變量
內(nèi)部類 getClasses() Class 型數(shù)組 獲取所有權(quán)限為 public 的內(nèi)部類
內(nèi)部類 getDeclaredClasses() Class 型數(shù)組 獲取所有內(nèi)部類
內(nèi)部類的聲明類 getDeclaringClass() Class 對象 如果該類為內(nèi)部類,則返回它的成員類,否則返回 null

如上表所示,在調(diào)用 getFields() 和 getMethods() 方法時將會依次獲取權(quán)限為 public 的字段和變量,然后將包含從超類中繼承到的成員實量和方法。而通過 getDeclareFields() 和 getDeclareMethod()只是獲取在本類中定義的成員變量和方法。

3.通過反射訪問的構(gòu)造方法的使用

為了能夠動態(tài)獲取對象構(gòu)造方法的信息,首先需要通過下列方法之一創(chuàng)建一個Constructor類型的對象或者數(shù)組。

方法名 說明
getConstructors() 返回一個包含某些 Constructor 對象的數(shù)組,這些對象反映此 Class 對象所表示的類的所有公共構(gòu)造方法
getConstructor(Class<?>…parameterTypes) 返回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公共構(gòu)造方法
getDeclaredConstructors() 返回 Constructor 對象的一個數(shù)組,這些對象反映此 Class 對象表示的類聲明的所有構(gòu)造方法
getDeclaredConstructor(Class<?>...parameterTypes) 返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或接口的指定構(gòu)造方法

其中:參數(shù)的作用是指定列選,為需要反射獲取的類的 類型的Class對象如:類型.class

Constructor類的常用方法:

方法名稱 說明
isVarArgs() 查看該構(gòu)造方法是否允許帶可變數(shù)量的參數(shù),如果允許,返回 true,否則返回false
getParameterTypes() 按照聲明順序以 Class 數(shù)組的形式獲取該構(gòu)造方法各個參數(shù)的類型
getExceptionTypes() 以 Class 數(shù)組的形式獲取該構(gòu)造方法可能拋出的異常類型
newInstance(Object … initargs) 通過該構(gòu)造方法利用指定參數(shù)創(chuàng)建一個該類型的對象,如果未設(shè)置參數(shù)則表示采用默認(rèn)無參的構(gòu)造方法
setAccessiable(boolean flag) 如果該構(gòu)造方法的權(quán)限為 private,默認(rèn)為不允許通過反射利用 netlnstance()方法創(chuàng)建對象。如果先執(zhí)行該方法,并將入口參數(shù)設(shè)置為 true,則允許創(chuàng)建對象
getModifiers() 獲得可以解析出該構(gòu)造方法所采用修飾符的整數(shù)

通過 java.lang.reflect.Modifier 類可以解析出 getMocMers() 方法的返回值所表示的修飾符信息。在該類中提供了一系列用來解析的靜態(tài)方法,既可以查看是否被指定的修飾符修飾,還可以字符串的形式獲得所有修飾符。
Modifier類的常用方法

靜態(tài)方法名稱 說明
isStatic(int mod) 如果使用 static 修飾符修飾則返回 true,否則返回 false
isPublic(int mod) 如果使用 public 修飾符修飾則返回 true,否則返回 false
isProtected(int mod) 如果使用 protected 修飾符修飾則返回 true,否則返回 false
isPrivate(int mod) 如果使用 private 修飾符修飾則返回 true,否則返回 false
isFinal(int mod) 如果使用 final 修飾符修飾則返回 true,否則返回 false
toString(int mod) 以字符串形式返回所有修飾符

4.通過反射訪問的方法的使用

和Constructor類似:要動態(tài)獲取一個對象方法的信息,首先需要通過下列方法之一創(chuàng)建一個 Method 類型的對象或者數(shù)組。

方法名 說明
getMethod s() 返回一個包含某些 Method 對象的數(shù)組,這些對象反映此 Class 對象所表示的類的所有公共方法
getMethod (Class<?>…parameterTypes) 返回一個 Method 對象,它反映此 Class 對象所表示的類的指定公共方法
getDeclaredMethods() 返回 Method 對象的一個數(shù)組,這些對象反映此 Class 對象表示的類聲明的所有方法
getDeclaredMethod (Class<?>...parameterTypes) 返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定方法

Method類的常用方法:

靜態(tài)方法名稱 說明
getName() 獲取該方法的名稱
getParameterType() 按照聲明順序以 Class 數(shù)組的形式返回該方法各個參數(shù)的類型
getRetumType() 以 Class 對象的形式獲得該方法的返回值類型
getExceptionTypes() 以 Class 數(shù)組的形式獲得該方法可能拋出的異常類型
invoke(Object obj,Object...args) 利用 args 參數(shù)執(zhí)行指定對象 obj 中的該方法,返回值為 Object 類型
isVarArgs() 查看該方法是否允許帶有可變數(shù)量的參數(shù),如果允許返回 true,否 則返回 false
getModifiers() 獲得可以解析出該方法所采用修飾符的整數(shù)

5.通過反射訪問的方法的使用

和上面一樣,通過下列任意一個方法訪問成員變量時將返回 Field 類型的對象或數(shù)組。

方法名 說明
Fields() 返回一個包含某些 Field 對象的數(shù)組,這些對象反映此 Class 對象所表示的類的所有公共成員變量
getField (String name) 返回一個 Field 對象,它反映此 Class 對象所表示的類的指定公共成員變量
getDeclaredFields() 返回 Field 對象的一個數(shù)組,這些對象反映此 Class 對象表示的類聲明的所有成員變量
getDeclaredField (String name) 返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定成員變量

Field類的常用方法:

方法名稱 說明
getName() 獲得該成員變量的名稱
getType() 獲取表示該成員變量的 Class 對象
get(Object obj) 獲得指定對象 obj 中成員變量的值,返回值為 Object 類型
set(Object obj,Object value) 將指定對象 obj 中成員變量的值設(shè)置為 value
getlnt(0bject obj) 獲得指定對象 obj 中成員類型為 int 的成員變量的值
setlnt(0bject obj,int i) 將指定對象 obj 中成員變量的值設(shè)置為 i
setFloat(Object obj,float f) 將指定對象 obj 中成員變量的值設(shè)置為 f
getBoolean(Object obj) 獲得指定對象 obj 中成員類型為 boolean 的成員變量的值
setBoolean(Object obj,boolean b) 將指定對象 obj 中成員變量的值設(shè)置為 b
getFloat(Object obj) 獲得指定對象 obj 中成員類型為 float 的成員變量的值
setAccessible(boolean flag) 此方法可以設(shè)置是否忽略權(quán)限直接訪問 private 等私有權(quán)限的成員變量
getModifiers() 獲得可以解析出該方法所采用修飾符的整數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概述 1、Java反射機制(Java-Reflect): 在運行狀態(tài)中,對于任意一個類,都能夠知道這個類中的所...
    年少懵懂丶流年夢閱讀 4,585評論 0 5
  • 一、概述 Java反射機制定義 Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類中的所有屬性和方法...
    CoderZS閱讀 1,699評論 0 25
  • 不論是 Java 開發(fā) 還是 Android 開發(fā),反射、泛型、注解 都是架構(gòu)設(shè)計中很重要的一個知識點。 為了更好...
    JamFF閱讀 593評論 0 4
  • 問題: 在運行時,對一個JAVA類,能否知道屬性和方法;能否調(diào)用它的任意方法? 答案是可以的,JAVA提供一種反射...
    糖寶_閱讀 804評論 0 1
  • 這部家長里短,關(guān)于兄弟妹矛盾的電視劇,看得我怒火攻心。 其實我不想看的,但是雞湯文空閑的時候就看一兩集,然后剎車。...
    油膩老虎油閱讀 227評論 2 3

友情鏈接更多精彩內(nèi)容