API:
內(nèi)容:
- 反射基礎(chǔ)+反射基本流程
- 反射可訪問的常用信息
- 通過反射訪問的構(gòu)造方法的使用
- 通過反射訪問的方法的使用
- 通過反射訪問的方法的使用
- 無恥的反射小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 - 使用
Constructor、Method、Filed的實例對象構(gòu)造類的對象、調(diào)用類的方法、訪問/修改類的屬性
- 獲取類的Class對象:
- Class.forName(ClassName)
- 類名.class
- 對象.getCalss()
-
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ù)就是成員變量名。
-
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ù) |