溫馨提示×

溫馨提示×

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

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

Java循環(huán)怎么對bean的屬性進行賦值

發(fā)布時間:2021-08-20 17:33:42 來源:億速云 閱讀:178 作者:chen 欄目:開發(fā)技術

這篇文章主要講解了“Java循環(huán)怎么對bean的屬性進行賦值”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java循環(huán)怎么對bean的屬性進行賦值”吧!

項目背景

我們開發(fā)過程中會碰到這樣一類問題,就是數(shù)據(jù)層或三方接口返回的Bean對象需要轉(zhuǎn)換重新裝換一下我們需要的對象。我們通常的做法就是通過getter/setter方法進行一個一個進行賦值,這樣的話書寫起來太復雜了,并且太重復了。我嘗試寫了一個工具類,能夠?qū)Ω鞣N場景下的對象進行相互賦值。

功能介紹

  • 可以為將要賦值的對象進行單個單個的按順序賦值

  • 通過傳遞的屬性的index(就是他是第幾個屬性)獲取本屬性的值

  • 返回對象中屬性的數(shù)量

  • 兩個對象之間相互拷貝屬性值

  • 傳遞一個list,遍歷bean進行賦值

  • 傳遞一個數(shù)組,對對象進行賦值

  • 返回一個對象的屬性值集合

  • 返回一個對象的屬性值數(shù)組

注意注意注意?。?!

getDeclaredFields方法不能保證字段聲明的順序進行返回,但是基本上會按照這個順序的。所以以下的方法是建立在返回正確的順序上的基礎上的,但是兩個對象相互拷貝是沒有問題的。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * @author haoyan.shi
 * 想設計一個能夠解析一個bean的全部屬性并按照順序進行遍歷
 */
public class ObjectUtils {

    /**
     * 按照屬性的順序賦值??山邮躰ull,但是不能跳過某個屬性進行賦值。就是說就算
     * 有一個值為空,那你也要傳遞進行null
     *
     * @param target
     * @param value
     * @param <E>
     * @return
     */
    public static <E> E forEachSetValue(E target, Object value) {
        if (target == null) {
            return target;
        }
        List<Field> fields = new ArrayList<>();
        try {
            // 1.解析出所有的屬性
            Field[] declaredFields = target.getClass().getDeclaredFields();
            for (Field declaredField : declaredFields) {
                declaredField.setAccessible(true);
                fields.add(declaredField);
            }
            // 2.把每個屬性放入一個集合中
            if (fields.size() <= 0) {
                return target;
            }
            while (fields.get(0).get(target) != null) {
                fields.remove(0);
            }
            Field field = fields.get(0);
            field.set(target, value);
            fields.remove(0);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return target;
    }

    /**
     * 本方法為了遍歷索引進行賦值
     *
     * @param e
     * @param index
     * @return
     */
    public static Object forEachGetValue(Object e, int index) {
        try {
            Field[] declaredFields = e.getClass().getDeclaredFields();
            for (Field declaredField : declaredFields) {
                declaredField.setAccessible(true);
            }
            return declaredFields[index].get(e);
        } catch (IllegalAccessException illegalAccessException) {
            illegalAccessException.printStackTrace();
        }
        return e;
    }

    public static int size(Object o) {
        if (o == null) {
            return 0;
        }
        Field[] declaredFields = o.getClass().getDeclaredFields();
        return declaredFields.length;
    }

    /**
     * 本方法是為了把已經(jīng)有值得對象中屬性名相同的名屬性賦值到?jīng)]有值得對象用。
     *
     * @param target
     * @param value
     */
    public static <E> E copyValueFromObject(E target, Object value) {
        if (target == null || value == null) {
            return null;
        }
        Field[] vs = target.getClass().getDeclaredFields();
        Field[] ts = value.getClass().getDeclaredFields();

        try {
            for (int i = 0; i < vs.length; i++) {
                for (int j = 0; j < ts.length; j++) {
                    if (vs[i].getName().equals(ts[j])) {
                        ts[j].set(target, vs[i].get(value));
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return target;
    }

    /**
     * 這個方法能把list中的值按照順序設置到目標對象中
     *
     * @param target
     * @param value
     * @param <E>
     * @return
     */
    public static <E> E forEachSetValueFromList(E target, List value) {

        if (target == null || value == null || value.size() == 0) {
            return target;
        }
        Field[] ts = target.getClass().getDeclaredFields();
        try {
            for (int i = 0; i < ts.length; i++) {
                ts[i].set(target, value.get(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return target;
    }

    /**
     * 從數(shù)組中進行設置值
     *
     * @param target
     * @param value
     * @param <E>
     * @return
     */
    public static <E> E forEachSetValueFromArray(E target, Object[] value) {

        if (target == null || value == null || value.length == 0) {
            return target;
        }
        Field[] ts = target.getClass().getDeclaredFields();
        try {
            for (int i = 0; i < ts.length; i++) {
                ts[i].set(target, value[i]);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return target;
    }


    public static Object[] getArrayValue(Object o) {
        Field[] declaredFields = o.getClass().getDeclaredFields();
        Object[] result = new Object[declaredFields.length];
        try {
            for (int i = 0; i < declaredFields.length; i++) {
                result[i] = declaredFields[i].get(o);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static List getListValue(Object o) {
        Field[] declaredFields = o.getClass().getDeclaredFields();
        List result = new ArrayList(declaredFields.length);
        try {
            for (int i = 0; i < declaredFields.length; i++) {
                result.add(declaredFields[i].get(o));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

后期擴展:

1.我們可以定義一些注解,進行屬性匹配。注入值更精確。
2.還可以用jdk1.8中的函數(shù)接口,進行賦值。
3.甚至都可以作為jdk的新特性去擴展這個功能。

感謝各位的閱讀,以上就是“Java循環(huán)怎么對bean的屬性進行賦值”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java循環(huán)怎么對bean的屬性進行賦值這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

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

AI