動機:
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);
}
}