您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“java怎么使用反射給對象屬性賦值”,內容詳細,步驟清晰,細節處理妥當,希望這篇“java怎么使用反射給對象屬性賦值”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
最近項目中遇到一個問題,就是能實現一個類將以后的多語都進行轉換的通用方法,根據這個需求,決定使用反射實現,根據反射給對象屬性設置屬性值,下面是使用反射實現對對象屬性值進行設置的方法
// 給變量賦值 給object對象的某個字段賦值
f.set(object, value);
//拿到了Field類的實例后就可以調用其中的方法了
//方法:get(Object obj) 返回指定對象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()); } }
由此可見,使用反射我們能給很容易的給各個屬性進行設置,即使是private的屬性我們也能很輕松的設置屬性值,下面利用這個demo例子,就設置了我們的最初的功能。
也就是說,第一種方法,沒有調用屬性的set方法就完成了賦值,
但是第二種方法,是通過調用屬性的set方法來完成賦值。
所以,如果想在程序中改變程序的屬性的值的同時還想做一些額外的事情,可以將這些事情寫到set方法中并使用第二種方法
public class MultiLangContentUtil { /** * 從PO查詢數據賦值到DTO * 注意!!這里的多語字段根據 * 簡體中文的變量名 英文名和繁體名需要根據規則進行 指定 * 規則如下 * 英文名=簡體中文名2 * 繁體名=簡體中文名3 * * @param targetPO 數據庫中查詢出的數據 * @param targetDTO 將要轉換的對象DTO * @param targetMultiName 需要展示的多語字段 * @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進行展示 Field declaredFieldDTO = targetDTOClass.getDeclaredField(targetMultiName); declaredFieldDTO.setAccessible(true); switch (locale) { case ZH_CN: //獲取PO的值 Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName); //獲取DTO對象 declaredFieldPO.setAccessible(true); //對DTO根據PO進行設置 declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO)); break; case EN_US: //獲取PO的值 Field declaredFieldPO2 = targetPOClass.getDeclaredField(targetMultiName + 2); //獲取DTO對象 declaredFieldPO2.setAccessible(true); //對DTO根據PO進行設置 declaredFieldDTO.set(targetDTO, declaredFieldPO2.get(targetPO)); break; case ZH_TW: //獲取PO的值 Field declaredFieldPO3 = targetPOClass.getDeclaredField(targetMultiName + 3); //獲取DTO對象 declaredFieldPO3.setAccessible(true); //對DTO根據PO進行設置 declaredFieldDTO.set(targetDTO, declaredFieldPO3.get(targetPO)); break; default: break; } //防止沒有抽取多語的情況下沒有參照返回,默認情況下設置中文 if (StringUtils.isBlank((String) declaredFieldDTO.get(targetDTO))) { //獲取PO的值 Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName); //獲取DTO對象 declaredFieldPO.setAccessible(true); //對DTO根據PO進行設置 declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO)); } } catch (NoSuchFieldException e) { log.error("查詢當前字段--->{}不存在{},", targetMultiName, e); } catch (IllegalAccessException e) { log.error("查詢字段--->{}多語時發生非法狀態異常{},", targetMultiName, e); } catch (Exception e) { log.error("查詢字段{}多語時發生錯誤{},", targetMultiName, e); } catch (Throwable throwable) { log.error("查詢多語言字段{}發生未知錯誤{}", targetMultiName, ThrowableUtil.stackTraceToString(throwable)); } } /** * 更新多語字段 * * @param targetDTO 需要轉換的字段 * @param targetPO 數據庫PO * @param fieldName 多語字段 * @param MultiLangSize 多語字段的數量 */ 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("更新當前字段--->{}不存在{},", fieldName, e); } catch (IllegalAccessException e) { log.error("更新字段--->{}多語時發生非法狀態異常{},", fieldName, e); } catch (Exception e) { log.error("更新字段{}多語時發生錯誤{},", fieldName, e); } catch (Throwable throwable) { log.error("更新多語言字段{}發生未知錯誤{}", fieldName, ThrowableUtil.stackTraceToString(throwable)); } } /** * 獲取本地的語言,默認中文 * en_US 英文 * zh_CN 簡體中文 * zh_TW 繁體中文 * * @return */ public static final String getLocale() { String locale = InvocationInfoProxy.getLocale(); return StringUtils.isEmpty(locale) ? "zh_CN" : locale; } }
這個工具類的核心思想就是
使用Field的get方法獲取屬性值
Field的set方法設置屬性
// 給變量賦值 給object對象的某個字段賦值
f.set(object, value);
//拿到了Field類的實例后就可以調用其中的方法了
//方法:get(Object obj) 返回指定對象obj上此 Field 表示的字段的值
讀到這里,這篇“java怎么使用反射給對象屬性賦值”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。