package com.xkrs.utils; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; /** * @author xkrs */ public class BeanUtils { /** * 缓存BeanCopier 对象 提升性能 */ private static final ConcurrentHashMap BEAN_COPIER_MAP = new ConcurrentHashMap<>(); /** * Bean属性复制工具方法。 * @param sources 原始集合 * @param supplier: 目标类::new(eg: UserVO::new) */ public static List cgLibCopyList(List sources, Supplier supplier) { List 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; } /** * Bean属性复制工具方法。 * @param source 目标对象 * @param supplier: 目标类::new(eg: UserVO::new) */ public static T cgLibCopyBean(Object source, Supplier supplier) { T t = supplier.get(); getBeanCopier(source.getClass(), t.getClass()).copy(source, t, null); return t; } /** * 获取BeanCopier对象 如果缓存中有从缓存中获取 如果没有则新创建对象并加入缓存 * @param sourceClass * @param targetClass * @return */ 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; } /** * 生成缓存key */ private static String getKey(String sourceClassName, String targetClassName) { return sourceClassName + targetClassName; } }