BeanUtils 工具类提供了非常丰富的Java反射API,开发过程中使用恰当可以减少很懂工作量。 其中最常用的莫过于copyProperties
:
场景设想
比如有属性比较多的两个类,User.java
和 UserForm.java
它们俩有部分属性字段是一样的,但UserForm.java
是对应前端表单、User.java
对应数据库的实体映射,前者带的属性比较多,或者有些字段名称不一样,我现在从前端拿到UserForm.java
实体后要快速把匹配的属性拷贝到User.java
中来。
实践
一般的做法
//接口传来 userForm对象
User myUser= new User();
myUser.setId(userForm.getId())
myUser.setName(userForm.getName())
........
myUser.setDepartment(userForm.getOrigin())
使用 copyProperties 接口后
User myUser= new User();
//批量拷贝匹配的属性
copyProperties(myUser, userForm);
//不匹配的属性再更新过来
myUser.setDepartment(userForm.getOrigin())
当然 copyProperties
接口还提供了其他参数的入口可以按需使用, 下面封装一个工具类
public class BeanCopyUtil extends BeanUtils {
/**
* 集合数据的拷贝
* @param sources: 数据源类
* @param target: 目标类::new(eg: UserVO::new)
* @return
*/
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
return copyListProperties(sources, target, null);
}
/**
* S: 数据源类 ,T: 目标类
*/
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, BeanUtilsCallBack<S, T> callBack) {
List<T> list = new ArrayList<>(sources.size());
for (S source : sources) {
T t = target.get();
copyProperties(source, t);
list.add(t);
if (callBack != null) {
// 回调
callBack.callBack(source, t);
}
}
return list;
}
}