不说其他的,先上代码
碰到下面场景
当oldUser的值不为空的时候,把oldUser的值赋给newUser
此时无法简单的使用BeanUtils的copyProperties方法。
private UserEntity copyNotNullEntity(){
UserEntity newUser = new UserEntity();
UserEntity oldUser = new UserEntity();
//当oldUser的值不为空的时候,把oldUser的值赋给newUser
if(StringUtils.isNotBlank(oldUser.getId())){
newUser.setId(oldUser.getId());
}
if(StringUtils.isNotBlank(oldUser.getName())){
newUser.setName(oldUser.getName());
}
if(StringUtils.isNotBlank(oldUser.getFullName())){
newUser.setFullName(oldUser.getFullName());
}
if(StringUtils.isNotBlank(oldUser.getPassword())){
newUser.setPassword(oldUser.getPassword());
}
if(StringUtils.isNotBlank(oldUser.getUserName())){
newUser.setUserName(oldUser.getUserName());
}
BeanUtils.copyProperties(oldUser, newUser);
return newUser;
}
看着这样的代码就感觉很乱。如果User类增加一个属性,就又需要增加一个判断。并不利于系统的扩展。
重构代码,合理利用BeanUtils。首先判断oldUser的值是否为空,如果为空,就把当前属性放入ignoreProperties中。
public static void copyNotNullPara(Object source,Object target) throws Exception{
List<String> ignoreProperties = new ArrayList<String>();
for (Field field : source.getClass().getDeclaredFields()) {
field.setAccessible(true);
Object value = field.get(source);
if( value == null){
ignoreProperties.add(field.getName());
}
}
BeanUtils.copyProperties(source, target, ignoreProperties.toArray(new String[0]));
}
首先获取source的反射的属性名的集合,遍历获取source的值。当值为null,把该属性放入排掉的ignoreProperties集合中。