Java反射機制,反射相關(guān)API,反射API使用方式(反射獲取實體類字段名和注解值)
1. 認識反射
Java反射機制是指在運行狀態(tài)中,動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能。
Java的反射機制是其一大特性,反射機制是構(gòu)建框架技術(shù)的基礎(chǔ)所在。
Java反射有三個動態(tài)性質(zhì):
- 運行時生成對象實例
- 運行期間調(diào)用方法
- 運行時更改屬性
Java的反射機制在編譯時并不確定是哪個類被加載了,而是在程序運行時才加載、探知、使用,這樣的特點就是反射。
類似于光學(xué)中的反射概念,在計算機科學(xué)領(lǐng)域,反射是指一類應(yīng)用,它們能夠自描述和自控制。
Java反射可實現(xiàn)的功能:
- 在運行時判斷任意一個對象所屬的類
- 在運行時構(gòu)造任意一個類的對象
- 在運行時判斷任意一個類所具有的方法和屬性
- 在運行時調(diào)用任意一個對象的方法
- …
使用反射的基本步驟
- 獲得需要操作的類的Java.lang.Class對象
- 調(diào)用Class的方法獲取Field、Method等對象
- 使用反射API進行操作
2. 反射相關(guān)API
Java反射技術(shù)常用的類:
- Class類:反射的核心類,反射所有的操作都是圍繞該類來生成的。通過Class類,可以獲取類的屬性、方法等內(nèi)容信息。
- Field類:表示類的屬性,可以獲取和設(shè)置類中屬性的值。
- Method類:表示類的方法,可以用來獲取類中方法的信息,或者執(zhí)行方法。
- Constructor類: 表示類的構(gòu)造方法。
獲取Class對象
每個類被加載后,系統(tǒng)就會為該類生成一個對應(yīng)的Class對象,通過該Class對象就可以訪問JVM中的這個類。
Java程序獲得Class對象通常有以下三種方式:
- 調(diào)用對象的getClass()方法:getClass()方法是java.lang.Object類中的一個方法,所有的Java對象都可以調(diào)用該方法,該方法會返回該對象所屬類的Class對象。
代碼如下:
Student s = new Student(); Class c = s.getClass();
- 調(diào)用類的Class屬性:調(diào)用類的Class屬性可獲取該類對應(yīng)的Class對象,這種方式需要在編譯期間就知道類的名稱。
代碼如下:
Class s = Student.class;
- 使用Class類的forName()靜態(tài)方法:使用Class類的forName()靜態(tài)方法也可以獲取該類對應(yīng)的Class對象。此方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個類的全名(包名.類名)。
代碼如下:
Class s = Class.forName("com.xingze.pojo.Student"); //正確
Class s = Class.forName("Student"); //錯誤,會拋出ClassNotFoundException異常從Class對象中獲取信息
在獲得了某個類所對應(yīng)的Class對象之后,程序就可以調(diào)用Class對象的方法來獲取該類的詳細信息。
Class類提供了大量實例方法來獲取對應(yīng)類的詳細信息,如構(gòu)造方法、普通方法、屬性、注解等其他信息。
具體如下:
- 訪問Class對應(yīng)的類包含的構(gòu)造方法
| 方法 | 說明 |
|---|---|
| Constructor getConstructor(Class[] params) | 返回此Class對象所包含的指定的public構(gòu)造方法,params參數(shù)是按聲明順序指定該構(gòu)造方法參數(shù)類型的Class對象的一個數(shù)組。構(gòu)造方法的參數(shù)類型與params所指定的參數(shù)類型匹配。如:Constructor co = s.getConstructor(String.class,Integer.class); //s是某個Class對象 |
| Constructor[] getConstructors(Class[] params) | 返回此Class對象所包含的所有public構(gòu)造方法 |
| Constructor getDeclaredConstructor(Class[] params ) | 返回此Class對象所包含的指定的構(gòu)造方法,與訪問級別無關(guān)(可訪問paivate構(gòu)造方法) |
| Constructor[] getDeclaredConstructors( ) | 返回此Class對象所包含的所有構(gòu)造方法,與訪問級別無關(guān)(可訪問paivate構(gòu)造方法) |
- 訪問Class對應(yīng)的類包含的方法
| 方法 | 說明 |
|---|---|
| Method getMethod(String name, Class[] params) | 返回此Class對象所包含的指定的public方法,name參數(shù)用于指定方法名稱,params參數(shù)是按聲明順序指定該方法參數(shù)類型的Class對象的一個數(shù)組。構(gòu)造方法的參數(shù)類型與params所指定的參數(shù)類型匹配。如:Method m = s.getMethod(“info”,String.class,Integer.class); //s是某個Class對象 |
| Method[] getMethods() | 返回此Class對象所包含的所有public方法 |
| Method getDeclaredMethod(String name, Class[] params) | 返回此Class對象所包含的指定的方法,與訪問級別無關(guān)(可訪問paivate方法) |
| Method[] getDeclaredMethods( ) | 返回此Class對象所包含的所有方法,與訪問級別無關(guān)(可訪問paivate方法) |
- 訪問Class對應(yīng)的類包含的屬性
| 方法 | 說明 |
|---|---|
| Field getField(String name) | 返回此Class對象所包含的指定的public屬性,name參數(shù)用于指定屬性名稱,如:Field age1 = s.getField(“age”); //s是某個Class對象,age為屬性名 |
| Field[] getFields() | 返回此Class對象所包含的所有public屬性 |
| Field getDeclaredField(String name) | 返回此Class對象所包含的指定的public屬性,與訪問級別無關(guān)(可訪問paivate屬性) |
| Field[] getDeclaredFields( ) | 返回此Class對象所包含的所有屬性,與訪問級別無關(guān)(可訪問paivate屬性) |
- 訪問Class對應(yīng)的類包含的注解
| 方法 | 說明 |
|---|---|
| < A extends Annotation > A getAnnotation(Class annotationClass) | 試圖獲取該Class對象所表示類上的所有注解,如果該類型的注解不存在則返回null。annotationClass參數(shù)對應(yīng)于注解類型的Class對象 |
| Annotation[] getAnnotations() | 返回此類上的所有注解 |
| Annotation[] getDeclaredAnnotations() | 返回直接存在于此類上的所有注解 |
- 訪問Class對應(yīng)的類包含的其他信息
| 方法 | 說明 |
|---|---|
| Class[] getDeclaredClasses() | 返回Class對應(yīng)的類所在的外部類 |
| Class[] getDeclaringClasses() | 返回Class對應(yīng)的類所在的內(nèi)部類 |
| Class[] getInterfaces() | 返回Class對應(yīng)的類所實現(xiàn)的全部接口 |
| Class[] getPackage() | 返回Class對應(yīng)的類所在的包 |
| Class[] getName() | 返回Class對應(yīng)的類的名稱 |
| Class[] getSimpleName() | 返回Class對應(yīng)的類的簡稱 |
3. 反射API使用
反射獲取實體類字段名和注解值
/**
* 獲取指定實體類字段名和title注解值
*
*/
public static Map<String, String> getFieldTitleMap(String className) {
try {
Map<String, String> map = new HashMap<>();
Field[] fields = Class.forName(className).getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Title.class)) {
map.put(field.getName(), field.getAnnotation(Title.class).value());
}
}
return map;
} catch (Exception e) {
logger.error(e.getMessage());
}
return Collections.emptyMap();
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA 2020.1 搜索不到Chinese (Simplified) Language
小編在安裝中文插件時遇到IDEA 2020.1 搜索不到Chinese ​(Simplified)​ Language Pack EAP,無法安裝的問題,本文給大家分享我的解決方法,感興趣的朋友一起看看吧2020-04-04
Spring Boot2中如何優(yōu)雅地個性化定制Jackson實現(xiàn)示例
這篇文章主要為大家介紹了Spring Boot2中如何優(yōu)雅地個性化定制Jackson實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05

