中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java怎么使用反射給對象屬性賦值

發布時間:2023-04-04 14:31:31 來源:億速云 閱讀:160 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“java怎么使用反射給對象屬性賦值”,內容詳細,步驟清晰,細節處理妥當,希望這篇“java怎么使用反射給對象屬性賦值”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

前言

最近項目中遇到一個問題,就是能實現一個類將以后的多語都進行轉換的通用方法,根據這個需求,決定使用反射實現,根據反射給對象屬性設置屬性值,下面是使用反射實現對對象屬性值進行設置的方法

方法1:這里使用了Field的set方的 Field 屬性,然后設置可見性,然后設置了一個值,最后打印

// 給變量賦值 給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());
 
    }
}

方法2:使用invoke方法

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());
 
    }
}

java怎么使用反射給對象屬性賦值

由此可見,使用反射我們能給很容易的給各個屬性進行設置,即使是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怎么使用反射給對象屬性賦值”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣恩县| 孝昌县| 灌阳县| 浪卡子县| 康保县| 天等县| 靖西县| 新沂市| 平顺县| 孟州市| 攀枝花市| 绍兴县| 梓潼县| 淳化县| 丹东市| 泰来县| 聊城市| 神农架林区| 左云县| 宁化县| 太湖县| 章丘市| 德庆县| 永泰县| 讷河市| 靖远县| 富锦市| 临泽县| 资溪县| 鞍山市| 荔波县| 原阳县| 收藏| 黎平县| 农安县| 彰化县| 涪陵区| 东丽区| 绍兴县| 天等县| 景洪市|