可以實現單個對象拷貝,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);
// }
}