BeanUtils拷貝忽略空值

動機:

BeanUtils是將一個對象拷貝到另外一個對象上去,但是如果source對象中如果有null值,會將原對象中有值的屬性覆蓋,這不是我們所希望的,我們只想拷貝非null的屬性,所以寫了以下工具類,注意:以下工具類沒有實現深拷貝,只是淺拷貝能去除null

package com.tangyaya8.mmall.utils;

import com.google.common.collect.Lists;
import com.tangyaya8.mmall.pojo.User;
import org.springframework.beans.BeanUtils;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @author tangxuejun
 * @version 2019-05-10 18:16
 */
public class CopyUtils {
    public static void copyBeanIgnoreNull(Object source, Object target, String... ignore) throws Exception {
        Objects.requireNonNull(source);
        Objects.requireNonNull(target);
        List<String> ignoreCopyProperties = Lists.newArrayList();
        if (ignore != null) {
            ignoreCopyProperties.addAll(Arrays.asList(ignore));
        }
        Field[] fields = source.getClass().getDeclaredFields();
        for (int i = fields.length - 1; i >= 0; i--) {
            Field field = fields[i];
            //打開私有訪問
            boolean canAccess = field.canAccess(source);
            if (!canAccess) {
                field.setAccessible(true);
            }
            Object fieldValue = field.get(source);
            if (fieldValue == null) {
                ignoreCopyProperties.add(field.getName());
            }
            field.setAccessible(canAccess);
        }
        BeanUtils.copyProperties(source, target, ignoreCopyProperties.toArray(new String[]{}));
    }

    public static void main(String[] args) throws Exception {
        User user = new User();
        User user1 = new User();
        user.setUserName("tangbaobao");
        user1.setUserName("tangdandan");
        user1.setPassword("meme");
        copyBeanIgnoreNull(user,user1);
        System.out.println(user1);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章