最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java循環(huán)對(duì)bean的屬性進(jìn)行賦值的實(shí)現(xiàn)

 更新時(shí)間:2021年08月20日 16:02:26   作者:BHBshy  
本文主要介紹了Java循環(huán)對(duì)bean的屬性進(jìn)行賦值,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

項(xiàng)目背景

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

功能介紹

  • 可以為將要賦值的對(duì)象進(jìn)行單個(gè)單個(gè)的按順序賦值
  • 通過(guò)傳遞的屬性的index(就是他是第幾個(gè)屬性)獲取本屬性的值
  • 返回對(duì)象中屬性的數(shù)量
  • 兩個(gè)對(duì)象之間相互拷貝屬性值
  • 傳遞一個(gè)list,遍歷bean進(jìn)行賦值
  • 傳遞一個(gè)數(shù)組,對(duì)對(duì)象進(jìn)行賦值
  • 返回一個(gè)對(duì)象的屬性值集合
  • 返回一個(gè)對(duì)象的屬性值數(shù)組

注意注意注意!??!

getDeclaredFields方法不能保證字段聲明的順序進(jìn)行返回,但是基本上會(huì)按照這個(gè)順序的。所以以下的方法是建立在返回正確的順序上的基礎(chǔ)上的,但是兩個(gè)對(duì)象相互拷貝是沒(méi)有問(wèn)題的。

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

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

    /**
     * 按照屬性的順序賦值??山邮躰ull,但是不能跳過(guò)某個(gè)屬性進(jìn)行賦值。就是說(shuō)就算
     * 有一個(gè)值為空,那你也要傳遞進(jìn)行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.把每個(gè)屬性放入一個(gè)集合中
            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;
    }

    /**
     * 本方法為了遍歷索引進(jìn)行賦值
     *
     * @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)有值得對(duì)象中屬性名相同的名屬性賦值到?jīng)]有值得對(duì)象用。
     *
     * @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;
    }

    /**
     * 這個(gè)方法能把list中的值按照順序設(shè)置到目標(biāo)對(duì)象中
     *
     * @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ù)組中進(jìn)行設(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;
    }
}

后期擴(kuò)展:

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

到此這篇關(guān)于Java循環(huán)對(duì)bean的屬性進(jìn)行賦值的文章就介紹到這了,更多相關(guān)Javabean屬性賦值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能

    Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能

    這篇文章主要為大家詳細(xì)介紹了Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java連接 JDBC基礎(chǔ)知識(shí)(操作數(shù)據(jù)庫(kù):增刪改查)

    Java連接 JDBC基礎(chǔ)知識(shí)(操作數(shù)據(jù)庫(kù):增刪改查)

    這篇文章主要介紹了Java連接 JDBC基礎(chǔ)知識(shí),包括操作數(shù)據(jù)庫(kù)之增刪改查操作,需要的朋友可以參考下
    2021-04-04
  • java并發(fā)編程synchronized底層實(shí)現(xiàn)原理

    java并發(fā)編程synchronized底層實(shí)現(xiàn)原理

    這篇文章主要介紹了java并發(fā)編程synchronized底層實(shí)現(xiàn)原理
    2022-02-02
  • Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解

    Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解

    這篇文章主要介紹了Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 如何基于SpringBoot實(shí)現(xiàn)人臉識(shí)別功能

    如何基于SpringBoot實(shí)現(xiàn)人臉識(shí)別功能

    人工智能時(shí)代的到來(lái),相信大家已耳濡目染,虹軟免費(fèi),離線開(kāi)放的人臉識(shí)別SDK,正推動(dòng)著全行業(yè)進(jìn)入刷臉時(shí)代,下面這篇文章主要給大家介紹了關(guān)于如何基于SpringBoot實(shí)現(xiàn)人臉識(shí)別功能的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Spring集成事務(wù)代碼實(shí)例

    Spring集成事務(wù)代碼實(shí)例

    這篇文章主要介紹了Spring集成事務(wù)代碼實(shí)例,pring事務(wù)的本質(zhì)其實(shí)就是數(shù)據(jù)庫(kù)對(duì)事務(wù)的支持,使用JDBC的事務(wù)管理機(jī)制,就是利用java.sql.Connection對(duì)象完成對(duì)事務(wù)的提交,需要的朋友可以參考下
    2023-10-10
  • 淺談BeanPostProcessor加載次序及其對(duì)Bean造成的影響分析

    淺談BeanPostProcessor加載次序及其對(duì)Bean造成的影響分析

    這篇文章主要介紹了淺談BeanPostProcessor加載次序及其對(duì)Bean造成的影響分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 深入淺析Java Object Serialization與 Hadoop 序列化

    深入淺析Java Object Serialization與 Hadoop 序列化

    序列化是指將結(jié)構(gòu)化對(duì)象轉(zhuǎn)化為字節(jié)流以便在網(wǎng)絡(luò)上傳輸或者寫到磁盤永久存儲(chǔ)的過(guò)程。下面通過(guò)本文給大家分享Java Object Serialization與 Hadoop 序列化,需要的朋友可以參考下
    2017-06-06
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之教室預(yù)訂管理系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之教室預(yù)訂管理系統(tǒng)的實(shí)現(xiàn)

    這是一個(gè)使用了java+SpringBoot+Maven+Vue+mysql開(kāi)發(fā)的教室預(yù)訂管理系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有教室預(yù)訂管理該有的所有功能,感興趣的朋友快來(lái)看看吧
    2022-02-02
  • java 判斷二進(jìn)制文件的方法

    java 判斷二進(jìn)制文件的方法

    這篇文章主要介紹了java 判斷二進(jìn)制文件的方法的相關(guān)資料,這里提供實(shí)例來(lái)實(shí)現(xiàn)判斷文件是否問(wèn)二進(jìn)制文件,希望能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

贵南县| 根河市| 泰和县| 梁平县| 简阳市| 澄江县| 渝北区| 农安县| 堆龙德庆县| 池州市| 万山特区| 榕江县| 澄江县| 南通市| 延长县| 韶关市| 抚宁县| 依安县| 永康市| 香格里拉县| 盐亭县| 新兴县| 玉屏| 句容市| 南部县| 历史| 邯郸市| 左云县| 长白| 视频| 西畴县| 南投县| 合水县| 枣阳市| 晋江市| 沂源县| 沈阳市| 泸州市| 池州市| 重庆市| 波密县|