package com.lion.mybatis.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
public class BeanUtils {
private static final ConcurrentHashMap<String, org.springframework.cglib.beans.BeanCopier> BEAN_COPIER_MAP = new ConcurrentHashMap<>();
public static <S, T> List<T> cgLibCopyList(List<S> sources, Supplier<T> supplier) {
List<T> list = new ArrayList<>(sources.size());
org.springframework.cglib.beans.BeanCopier beanCopier = null;
for (S source: sources) {
T t = supplier.get();
if(beanCopier == null){
beanCopier = getBeanCopier(source.getClass(), t.getClass());
}
beanCopier.copy(source, t, null);
list.add(t);
}
return list;
}
public static <T> T cgLibCopyBean(Object source, Supplier<T> supplier){
T t = supplier.get();
getBeanCopier(source.getClass(), t.getClass()).copy(source, t, null);
return t;
}
private static org.springframework.cglib.beans.BeanCopier getBeanCopier(Class<?> sourceClass, Class<?> targetClass) {
String key = getKey(sourceClass.getName(), targetClass.getName());
org.springframework.cglib.beans.BeanCopier beanCopier;
beanCopier = BEAN_COPIER_MAP.get(key);
if(beanCopier == null){
beanCopier = org.springframework.cglib.beans.BeanCopier.create(sourceClass, targetClass, false);
BEAN_COPIER_MAP.put(key, beanCopier);
}
return beanCopier;
}
private static String getKey(String sourceClassName, String targetClassName){
return sourceClassName + targetClassName;
}
}