可以实现单个对象拷贝,List拷贝,源和目标类属性字段不一致时也可以拷贝。
回调类:
用于处理在拷贝过程中源和目标类字段不一致的情况
/**
* <p>Title: BeanCopierUtilCallBack</p>
* <p>Description: bean拷贝回调方法</p>
* @author wangzhj
* @date 2020年6月2日
*/
@FunctionalInterface
public interface BeanCopierUtilCallBack<S, T> {
/**
* 默认回调方法
* @param s
* @param t
*/
void callBack(S t, T s);
}
拷贝工具类,基于cglib实现:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import net.sf.cglib.beans.BeanCopier;
/**
* <p>Title: BeanCopier</p>
* <p>Description: bean复制工具,利用cglib来实现,相比用反射机制实现性能更高</p>
* @author wangzhj
* @date 2020年6月2日
*/
public class BeanCopierUtil {
public static void copy(Object from, Object to) {
BeanCopier copier = BeanCopier.create(from.getClass(), to.getClass(), false);
copier.copy(from, to, null);
}
public static <T> T copy(Object from, Supplier<T> to,Class<T> clazz) {
BeanCopier copier = BeanCopier.create(from.getClass(), clazz, false);
T t = to.get();
copier.copy(from, t, null);
return t;
}
/**
* 集合数据的拷贝
* @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);
}
/**
* 带回调函数的集合数据的拷贝(可自定义字段拷贝规则)
* @param sources: 数据源类
* @param target: 目标类::new(eg: UserVO::new)
* @param callBack: 回调函数
* @return
*/
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, BeanCopierUtilCallBack<S, T> callBack) {
List<T> list = new ArrayList<>(sources.size());
for (S source : sources) {
T t = target.get();
copy(source, t);
list.add(t);
if (callBack != null) {
// 回调
callBack.callBack(source, t);
}
}
return list;
}
// @Test
// public void listCopyUpWithCallback() {
// List<UserDO> userDOList = new ArrayList();
// userDOList.add(new UserDO(1L, "Van", 18, 1));
// userDOList.add(new UserDO(2L, "VanVan", 20, 2));
// List<UserVO> userVOList = BeanCopyUtil.copyListProperties(userDOList, UserVO::new, (userDO, userVO) ->{
// // 这里可以定义特定的转换规则
// userVO.setSex(SexEnum.getDescByCode(userDO.getSex()).getDesc());
// });
// log.info("userVOList:{}",userVOList);
// }
}