Java開發(fā)反射機制的實戰(zhàn)經(jīng)驗總結(jié)_第1頁
Java開發(fā)反射機制的實戰(zhàn)經(jīng)驗總結(jié)_第2頁
Java開發(fā)反射機制的實戰(zhàn)經(jīng)驗總結(jié)_第3頁
Java開發(fā)反射機制的實戰(zhàn)經(jīng)驗總結(jié)_第4頁
Java開發(fā)反射機制的實戰(zhàn)經(jīng)驗總結(jié)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第Java開發(fā)反射機制的實戰(zhàn)經(jīng)驗總結(jié)System.out.println("屬性名:"+field.getName());

System.out.println("屬性的類型:"+field.getGenericType().getTypeName());

打印輸出User的屬性和屬性類型——

屬性名:name

屬性的類型:java.lang.String

屬性名:age

屬性的類型:java.lang.String

利用反射獲取到類的字段屬性后,是不是可以利用反射來創(chuàng)建一個對象呢?答案是肯定的。

例如,可以類似下面代碼,通過反射得到的字段屬性,進而創(chuàng)建一個對象。

MapString,Objectfileds=newHashMap();

fileds.put("name","張三");

fileds.put("age","10");

Objecto=User.class.newInstance();

Field[]fields=o.getClass().getDeclaredFields();

for(Fieldfield:fields){

//設(shè)置后可用反射訪問訪問私有變量

field.setAccessible(true);

//通過反射給屬性賦值

field.set(o,fileds.get(field.getName()));

Useruser1=(User)o;

System.out.println(user1.toString());

什么場景下可能需要這樣做的呢?像一些內(nèi)部數(shù)據(jù)與外部數(shù)據(jù)字段的映射,就可以通過類似的字段反射方式,將源數(shù)據(jù)映射給目標(biāo)數(shù)據(jù),進而得到可以插入數(shù)據(jù)庫的目標(biāo)對象。

三、反射動態(tài)修改類屬性的注解值

注意一點,我們在設(shè)置User類時,對其中一個字段加了注解:@Value(value="age_a")。這是一種設(shè)置值的注解,既然是設(shè)置值,是否還可以在代碼運行過程中,根據(jù)不同情況來動態(tài)修改呢?

字段上的注解,其實都存放在一個memberValues屬性里,這是一個map,可以這樣來獲取——

Field[]fields=User.class.getDeclaredFields();

for(Fieldfield:fields){

//設(shè)置后可用反射訪問訪問私有變量

if("age".equals(field.getName())){

field.setAccessible(true);

//獲取annotation這個代理實例所持有的InvocationHandler

InvocationHandlerinvocationHandler=Proxy.getInvocationHandler(field.getAnnotation(Value.class));

//獲取InvocationHandler的memberValues字段

FieldmemberValues=invocationHandler.getClass().getDeclaredField("memberValues");

memberValues.setAccessible(true);

MapString,Objectvalues=(MapString,Object)memberValues.get(invocationHandler);

System.out.println(values);

debug打斷點,可以看到——

這個MapString,Object存儲的是該@注解里的所有屬性值,這里,@Value只有一個value屬性——

public@interfaceValue{

Stringvalue();

若把它換成類似@JSONField(name="age_a"),把上邊的代碼稍微修改下,如:

Field[]fields=User.class.getDeclaredFields();

for(Fieldfield:fields){

if("age".equals(field.getName())){

field.setAccessible(true);

InvocationHandlerinvocationHandler=Proxy.getInvocationHandler(field.getAnnotation(JSONField.class));

......

@JSONField注解的內(nèi)部屬性有如下方式——

再運行剛剛的代碼,可以看到,這里MapString,Object獲取存儲到的,便是這個注解里所有的屬性與對應(yīng)的屬性值。

到了這一步,回到先前上邊的問題,若要動態(tài)改變這個注解的值,怎么處理呢?

其實,很簡單,只需要直接進行值設(shè)置就可以了,例如——

InvocationHandlerinvocationHandler=Proxy.getInvocationHandler(field.getAnnotation(Value.class));

FieldmemberValues=invocationHandler.getClass().getDeclaredField("memberValues");

memberValues.setAccessible(true);

MapString,Objectvalues=(MapString,Object)memberValues.get(invocat

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論