BeanCopier 对象拷贝
- 对象拷贝转为其他类的对象
- 对象数组拷贝转为其他类的对象数组
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.cglib.beans.BeanCopier;
/**
* BeanCopier工具类
*
* @author zwy
*/
public class BeanCopierUtil {
private static Map<String, BeanCopier> beanCopierMap = new ConcurrentHashMap<>();
/**
* 初始化 BeanCopier
*
* @param source
* @param target
* @return
*/
private static BeanCopier initCopier(Class source, Class target) {
BeanCopier beanCopier = BeanCopier.create(source, target, false);
beanCopierMap.put(source.getName() + "_" + target.getName(), beanCopier);
return beanCopier;
}
/**
* 获取BeanCopier
*
* @param source
* @param target
* @return
*/
private static BeanCopier getBeanCopier(Class source, Class target) {
BeanCopier beanCopier = beanCopierMap.get(source.getClass().getName() + "_" + target.getName());
if (beanCopier != null) {
return beanCopier;
}
return initCopier(source, target);
}
/**
* Pojo 类型转换(浅复制,字段名&类型相同则被复制)
*
* @param source 原对象
* @param targetClass 目标类
* @param <T>
* @return
*/
public static <T> T convert(Object source, Class<T> targetClass) {
if (source == null) {
return null;
}
BeanCopier beanCopier = getBeanCopier(source.getClass(), targetClass);
try {
T target = targetClass.getDeclaredConstructor().newInstance();
beanCopier.copy(source, target, null);
return target;
} catch (Exception e) {
throw new RuntimeException("对象拷贝失败" + source + "_" + targetClass);
}
}
/**
* Pojo 类型转换(浅复制,字段名&类型相同则被复制)
*
* @param source 原对象
* @param targetClass 目标类
* @param <E>
* @return
*/
public static <E> List<E> convert(List source, Class<E> targetClass) {
if (source == null) {
return null;
}
try {
if (source.isEmpty()) {
return source.getClass().getDeclaredConstructor().newInstance();
}
List result = source.getClass().getDeclaredConstructor().newInstance();
for (Object each : source) {
result.add(convert(each, targetClass));
}
return result;
} catch (Exception e) {
throw new RuntimeException("对象拷贝失败" + source + "_" + targetClass);
}
}
}