java反射機(jī)制實(shí)戰(zhàn)示例分享
首先,我們來認(rèn)識幾個類。
Class(java.lang.Class)
Class對象是一個特殊對象,每一個類都有一個Class對象,用來創(chuàng)建該類的“常規(guī)”對象。可以通過對象的getClass()方法獲取。
比如我們運(yùn)行這一行代碼:
System.out.println("測試".getClass().toString());
得到的結(jié)果就是:
class java.lang.String
Field(java.lang.reflect.Field)
這個類表示一個字段,可以使用這個字段來訪問類
下面,我們來創(chuàng)建測試類:
class Book {
public String title;
public int length = 0;
public ArrayList<Page> pages = null;
@Override
public String toString() {
String sb = "Book:\n";
sb += "title="+title+"\n";
sb += "length=" + length + "\n";
sb += "pages=" + pages + "\n";
if (pages != null) {
for (Page page : pages) {
sb += page.toString();
}
}
return sb.toString();
}
}
class Page {
@Override
public String toString() {
return "page\n";
}
}
調(diào)用以下方法來測試上面的類:
Book book = new Book();
System.out.println(book);
它的結(jié)果是這樣:
Book:
title=null
length=0
pages=null
這是book對象的初始狀態(tài)
我們下面通過反射機(jī)制,獲取book對象中的length字段并進(jìn)行修改,查看結(jié)果:
Book book = new Book();
Class<?> aClass = book.getClass();
Field field = aClass.getField("length");
field.setInt(book, 9);
System.out.println(book);
可以看到運(yùn)行結(jié)果是:
Book:
title=null
length=9
pages=null
可以看出,length字段的值已經(jīng)被修改了。
上面修改的是int型的簡單字段,事實(shí)上像title字段這樣的對象字段也是可以修改的,下面是示例:
Book book = new Book();
Class<?> aClass = book.getClass();
Field[] fields = aClass.getFields();
for (Field field : fields) {
field.setAccessible(true);
if(field.getType().equals(String.class)){
field.set(book, "格林童話");
}else if(field.getType().equals(int.class)){
field.set(book, 199);
}
}
System.out.println(book);
上面的代碼輸出結(jié)果是:
Book:
title=格林童話
length=199
pages=null
事實(shí)上,是將所有String類型的字段都修改成“格林童話”,將所有int類型字段都修改成199 。我們甚至根本不知道這個字段代表什么意思。
下面,我們對pages這個字段進(jìn)行修改。這個字段是個ArrayList,我們將創(chuàng)建一個ArrayList對象,并向其中插入一個對象。
Book book = new Book();
Class<?> aClass = book.getClass();
Field[] fields = aClass.getFields();
for (Field field : fields) {
field.setAccessible(true);
if(field.getType().equals(ArrayList.class)){
String genric = field.getGenericType().toString();
String genricClass = genric.substring(
genric.indexOf('<') + 1,
genric.indexOf('>'));
Class<?> entityClass = Class.forName(genricClass);
Object obj = entityClass.newInstance();
ArrayList list = new ArrayList();
list.add(obj);
field.set(book, list);
}
}
System.out.println(book);
輸出結(jié)果如下:
Book:
title=null
length=0
pages=[page
]
Page
可以看出,盡管我們根本沒有直接使用Page類,但還是創(chuàng)建出了一個Page對象。
Page對象的創(chuàng)建語句在:entityClass.newInstance()這一句。newInstance語句是Class對象的重要方法,用來創(chuàng)建這個類對應(yīng)的對象。當(dāng)然,需要類的構(gòu)造方法支持。另外,通過genGenericType方法,我們可以獲取到字段的類型修飾符。放在這里,獲取到的就是ArrayList<Page>。有了這一個字符串,我們就可以通過類加載器Class.forName來加載Page類并創(chuàng)建一個Page對象了。
- Java反射機(jī)制及Method.invoke詳解
- JAVA反射機(jī)制實(shí)例教程
- Java反射機(jī)制的實(shí)現(xiàn)詳解
- java反射機(jī)制示例詳解
- Java反射機(jī)制的學(xué)習(xí)總結(jié)
- Java反射機(jī)制(Reflection)淺析
- Java的反射機(jī)制---動態(tài)調(diào)用對象的簡單方法
- java基于線程池和反射機(jī)制實(shí)現(xiàn)定時任務(wù)完整實(shí)例
- java反射機(jī)制示例
- Java 反射機(jī)制詳解及實(shí)例代碼
- java 利用反射機(jī)制,獲取實(shí)體所有屬性和方法,并對屬性賦值
相關(guān)文章
關(guān)于BufferedReader的read()和readLine()的區(qū)別
這篇文章主要介紹了關(guān)于BufferedReader的read()和readLine()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringMVC生成的驗(yàn)證碼圖片不顯示問題及解決方法
這篇文章主要介紹了SpringMVC生成的驗(yàn)證碼圖片不顯示問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
MybatisPlus使用注解的多對多級聯(lián)查詢方式
這篇文章主要介紹了MybatisPlus使用注解的多對多級聯(lián)查詢方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringBoot 統(tǒng)一請求返回的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot 統(tǒng)一請求返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
使用Lombok @Builder注解導(dǎo)致默認(rèn)值無效的問題
這篇文章主要介紹了使用Lombok @Builder注解導(dǎo)致默認(rèn)值無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
Java實(shí)現(xiàn)ATM銀行管理系統(tǒng)(控制臺版本)
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)控制臺版本的ATM銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
Java使用wait和notify實(shí)現(xiàn)線程之間的通信
Java 線程通信是將多個獨(dú)立的線程個體進(jìn)行關(guān)聯(lián)處理,使得線程與線程之間能進(jìn)行相互通信,下面這篇文章主要給大家介紹了關(guān)于Java使用wait和notify實(shí)現(xiàn)線程之間通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04

