您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“java怎么使用反射給對(duì)象屬性賦值”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“java怎么使用反射給對(duì)象屬性賦值”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
最近項(xiàng)目中遇到一個(gè)問(wèn)題,就是能實(shí)現(xiàn)一個(gè)類將以后的多語(yǔ)都進(jìn)行轉(zhuǎn)換的通用方法,根據(jù)這個(gè)需求,決定使用反射實(shí)現(xiàn),根據(jù)反射給對(duì)象屬性設(shè)置屬性值,下面是使用反射實(shí)現(xiàn)對(duì)對(duì)象屬性值進(jìn)行設(shè)置的方法
// 給變量賦值 給object對(duì)象的某個(gè)字段賦值
f.set(object, value);
//拿到了Field類的實(shí)例后就可以調(diào)用其中的方法了
//方法:get(Object obj) 返回指定對(duì)象obj上此 Field 表示的字段的值
package com.example.reflectiondemo; import java.lang.reflect.Field; /** * @program my-project-model * @description: * @author: lee * @create: 2023/01/04 19:52 */ public class ReflectMain { private String readOnly; public String getReadOnly() { return readOnly; } public void setReadOnly(String readOnly) { System.out.println("set"); this.readOnly = readOnly; } public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { ReflectMain t = new ReflectMain(); Field f = t.getClass().getDeclaredField("readOnly"); f.setAccessible(true); f.set(t, "test"); System.out.println(t.getReadOnly()); } }
package com.example.reflectiondemo; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @program my-project-model * @description: * @author: lee * @create: 2023/01/04 19:52 */ public class ReflectMain { private String readOnly; public String getReadOnly() { return readOnly; } public void setReadOnly(String readOnly) { System.out.println("set"); this.readOnly = readOnly; } // public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { // ReflectMain t = new ReflectMain(); // Field f = t.getClass().getDeclaredField("readOnly"); // f.setAccessible(true); // f.set(t, "test"); // System.out.println(t.getReadOnly()); // // } public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { ReflectMain t = new ReflectMain(); Method setReadOnly = t.getClass().getMethod("setReadOnly", String.class); String s = "test2"; setReadOnly.invoke(t, s); System.out.println(t.getReadOnly()); } }
由此可見(jiàn),使用反射我們能給很容易的給各個(gè)屬性進(jìn)行設(shè)置,即使是private的屬性我們也能很輕松的設(shè)置屬性值,下面利用這個(gè)demo例子,就設(shè)置了我們的最初的功能。
也就是說(shuō),第一種方法,沒(méi)有調(diào)用屬性的set方法就完成了賦值,
但是第二種方法,是通過(guò)調(diào)用屬性的set方法來(lái)完成賦值。
所以,如果想在程序中改變程序的屬性的值的同時(shí)還想做一些額外的事情,可以將這些事情寫(xiě)到set方法中并使用第二種方法
public class MultiLangContentUtil { /** * 從PO查詢數(shù)據(jù)賦值到DTO * 注意?。∵@里的多語(yǔ)字段根據(jù) * 簡(jiǎn)體中文的變量名 英文名和繁體名需要根據(jù)規(guī)則進(jìn)行 指定 * 規(guī)則如下 * 英文名=簡(jiǎn)體中文名2 * 繁體名=簡(jiǎn)體中文名3 * * @param targetPO 數(shù)據(jù)庫(kù)中查詢出的數(shù)據(jù) * @param targetDTO 將要轉(zhuǎn)換的對(duì)象DTO * @param targetMultiName 需要展示的多語(yǔ)字段 * @throws NoSuchFieldException * @throws IllegalAccessException */ public static void setMultiLangDTOName(Object targetPO, Object targetDTO, String targetMultiName) { try { String locale = MultiLangContentUtil.getLocale(); Class<?> targetDTOClass = targetDTO.getClass(); Class<?> targetPOClass = targetPO.getClass(); //這里是將targetMultiName進(jìn)行展示 Field declaredFieldDTO = targetDTOClass.getDeclaredField(targetMultiName); declaredFieldDTO.setAccessible(true); switch (locale) { case ZH_CN: //獲取PO的值 Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName); //獲取DTO對(duì)象 declaredFieldPO.setAccessible(true); //對(duì)DTO根據(jù)PO進(jìn)行設(shè)置 declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO)); break; case EN_US: //獲取PO的值 Field declaredFieldPO2 = targetPOClass.getDeclaredField(targetMultiName + 2); //獲取DTO對(duì)象 declaredFieldPO2.setAccessible(true); //對(duì)DTO根據(jù)PO進(jìn)行設(shè)置 declaredFieldDTO.set(targetDTO, declaredFieldPO2.get(targetPO)); break; case ZH_TW: //獲取PO的值 Field declaredFieldPO3 = targetPOClass.getDeclaredField(targetMultiName + 3); //獲取DTO對(duì)象 declaredFieldPO3.setAccessible(true); //對(duì)DTO根據(jù)PO進(jìn)行設(shè)置 declaredFieldDTO.set(targetDTO, declaredFieldPO3.get(targetPO)); break; default: break; } //防止沒(méi)有抽取多語(yǔ)的情況下沒(méi)有參照返回,默認(rèn)情況下設(shè)置中文 if (StringUtils.isBlank((String) declaredFieldDTO.get(targetDTO))) { //獲取PO的值 Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName); //獲取DTO對(duì)象 declaredFieldPO.setAccessible(true); //對(duì)DTO根據(jù)PO進(jìn)行設(shè)置 declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO)); } } catch (NoSuchFieldException e) { log.error("查詢當(dāng)前字段--->{}不存在{},", targetMultiName, e); } catch (IllegalAccessException e) { log.error("查詢字段--->{}多語(yǔ)時(shí)發(fā)生非法狀態(tài)異常{},", targetMultiName, e); } catch (Exception e) { log.error("查詢字段{}多語(yǔ)時(shí)發(fā)生錯(cuò)誤{},", targetMultiName, e); } catch (Throwable throwable) { log.error("查詢多語(yǔ)言字段{}發(fā)生未知錯(cuò)誤{}", targetMultiName, ThrowableUtil.stackTraceToString(throwable)); } } /** * 更新多語(yǔ)字段 * * @param targetDTO 需要轉(zhuǎn)換的字段 * @param targetPO 數(shù)據(jù)庫(kù)PO * @param fieldName 多語(yǔ)字段 * @param MultiLangSize 多語(yǔ)字段的數(shù)量 */ public static void updateMultiLang(Object targetDTO, Object targetPO, String fieldName, Integer MultiLangSize) { try { Class<?> targetDTOClass = targetDTO.getClass(); Class<?> targetPOClass = targetPO.getClass(); Field dtoClassField = targetDTOClass.getDeclaredField(fieldName); dtoClassField.setAccessible(true); if (StringUtils.isNotBlank((String) dtoClassField.get(targetDTO))) { Field poClassField = targetPOClass.getDeclaredField(fieldName); poClassField.setAccessible(true); poClassField.set(targetPO, dtoClassField.get(targetDTO)); } for (int i = 2; i <= MultiLangSize; i++) { Field dtoClassField2 = targetDTOClass.getDeclaredField(fieldName + i); dtoClassField2.setAccessible(true); if (StringUtils.isNotBlank((String) dtoClassField2.get(targetDTO))) { Field poClassField2 = targetPOClass.getDeclaredField(fieldName + i); poClassField2.setAccessible(true); poClassField2.set(targetPO, dtoClassField2.get(targetDTO)); } } } catch (NoSuchFieldException e) { log.error("更新當(dāng)前字段--->{}不存在{},", fieldName, e); } catch (IllegalAccessException e) { log.error("更新字段--->{}多語(yǔ)時(shí)發(fā)生非法狀態(tài)異常{},", fieldName, e); } catch (Exception e) { log.error("更新字段{}多語(yǔ)時(shí)發(fā)生錯(cuò)誤{},", fieldName, e); } catch (Throwable throwable) { log.error("更新多語(yǔ)言字段{}發(fā)生未知錯(cuò)誤{}", fieldName, ThrowableUtil.stackTraceToString(throwable)); } } /** * 獲取本地的語(yǔ)言,默認(rèn)中文 * en_US 英文 * zh_CN 簡(jiǎn)體中文 * zh_TW 繁體中文 * * @return */ public static final String getLocale() { String locale = InvocationInfoProxy.getLocale(); return StringUtils.isEmpty(locale) ? "zh_CN" : locale; } }
這個(gè)工具類的核心思想就是
使用Field的get方法獲取屬性值
Field的set方法設(shè)置屬性
// 給變量賦值 給object對(duì)象的某個(gè)字段賦值
f.set(object, value);
//拿到了Field類的實(shí)例后就可以調(diào)用其中的方法了
//方法:get(Object obj) 返回指定對(duì)象obj上此 Field 表示的字段的值
讀到這里,這篇“java怎么使用反射給對(duì)象屬性賦值”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。