新建一个BeanCopierUtil工具类,源码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.cglib.beans.BeanCopier;
public class BeanCopierUtil {
/**
* BeanCopier的缓存
*/
static final ConcurrentHashMap<String, BeanCopier> BEAN_COPIER_CACHE = new ConcurrentHashMap<>();
/**
* BeanCopier的copy
* @author ranen
* @param source 源文件的
* @param target 目标文件
*/
public static void copy(Object source, Object target) {
BeanCopier beanCopier;
beanCopier = getBeanCopier(source.getClass(), target.getClass());
beanCopier.copy(source, target, null);
}
private static BeanCopier getBeanCopier(Class<?> srcClazz, Class<?> tgtClazz) {
String key = srcClazz.getName() + tgtClazz.getName();
BeanCopier beanCopier;
if (BEAN_COPIER_CACHE.containsKey(key)) {
beanCopier = BEAN_COPIER_CACHE.get(key);
} else {
beanCopier = BeanCopier.create(srcClazz, tgtClazz, false);
BEAN_COPIER_CACHE.put(key, beanCopier);
}
return beanCopier;
}
/**
* 拷贝List
* @param sources
* @param targerClazz
* @param <S>
* @param <T>
* @return
*/
public static <S, T> List<T> copyList(List<S> sources, Class<T> targerClazz) {
List<T> list = new ArrayList<>(sources.size());
org.springframework.cglib.beans.BeanCopier beanCopier = null;
for (S source : sources) {
T t = getObject(targerClazz);
if (beanCopier == null) {
beanCopier = getBeanCopier(source.getClass(), t.getClass());
}
beanCopier.copy(source, t, null);
list.add(t);
}
return list;
}
/**
* 生成key
* @author ranen
* @param srcClazz 源文件的class
* @param tgtClazz 目标文件的class
* @return string
*/
private static String genKey(Class<?> srcClazz, Class<?> tgtClazz) {
return srcClazz.getName() + tgtClazz.getName();
}
private static <T> T getObject(Class<T> clz) {
T obj = null;
try {
obj = clz.newInstance();
} catch (Exception var4) {
}
return obj;
}
}
总结:
1、为了不用每次都创建一个beanCopier,引入一级缓存,key为两个需要复制的类名的结合。
2、新建两个接口一个用于支持拷贝object,一个用于支持拷贝list。