package cn.efunbox.manage.common.utils; import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.beans.BeanMap; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * * 对象操作工具 * */ public class BeanUtil { /** * 缓存BeanCopier对象,加快对象浅拷贝效率 */ private static final Map BEAN_COPIERS = new ConcurrentHashMap<>(); /** * 缓存BeanMap对象,加快Map和javaBean对象的转化 */ private static final Map BEAN_MAP = new ConcurrentHashMap<>(); private BeanUtil(){}; /** * 浅拷贝 只拷贝相同属性名和类型的 * * @param srcObj * 被拷贝对象 * * @param destObj * 拷贝对象 * */ public static void copy(Object srcObj, Object destObj) { if (srcObj == null || destObj == null) { return; } String key = srcObj.getClass().getName() + destObj.getClass().getName(); BeanCopier copier = null; if (BEAN_COPIERS.get(key)==null) { synchronized (BeanUtil.class) { if(BEAN_COPIERS.get(key)==null){ copier = BeanCopier.create(srcObj.getClass(), destObj.getClass(), false); BEAN_COPIERS.put(key, copier); } } } else { copier = BEAN_COPIERS.get(key); } copier.copy(srcObj, destObj, null); } /** * 对象转map * @param obj * @param fieldNames 需要存入的属性名 属性名之间以,分隔 * @param * @return */ public static Map getMapByField(T obj, String fieldNames) { Map map = new HashMap(); if (obj == null || fieldNames == null) { return map; } BeanMap beanMap = null; beanMap=getBeanMap(obj); for (String f : fieldNames.split(",")) { map.put(f, beanMap.get(f)); } return map; } /** * 对象转map * @param obj * @param removefieldNames 不需要存入的属性名 属性名之间以,分隔 * @param * @return */ public static Map getMapByRemoveField(T obj, String removefieldNames) { Map map = new HashMap(); if (obj == null) { return map; } BeanMap beanMap = null; beanMap=getBeanMap(obj); for (Object key : beanMap.keySet()) { map.put(key + "", beanMap.get(key)); } if(removefieldNames!=null){ for(String key:removefieldNames.split(",")){ map.remove(key); } } return map; } /** * 对象转map * * @param srcObj * @return */ public static Map getMap(Object srcObj) { return getMapByRemoveField(srcObj, null); } /** * map转对象 * * @param map * @param obj * 需要转换的空对象 * * @return */ public static T mapToObj(Map map, T obj) { if (obj == null || map == null) { return null; } BeanMap beanMap = null; beanMap=getBeanMap(obj); beanMap.putAll(map); return obj; } /** * 对象集合转map集合 * * @param objList * @return */ public static List> objectsToMaps(List objList) { List> list = new ArrayList<>(); if (objList != null && objList.size() > 0) { Map map = null; T obj = null; for (int i = 0, size = objList.size(); i < size; i++) { obj = objList.get(i); map = getMap(obj); list.add(map); } } return list; } /** * map集合转对象集合 * * @param maps * @param clazz * 转换的对象class * @return */ public static List mapsToObjects(List> maps, Class clazz) { List list = new ArrayList<>(); if (maps != null && maps.size() > 0) { Map map = null; T bean = null; try { for (int i = 0, size = maps.size(); i < size; i++) { map = maps.get(i); bean = clazz.newInstance(); mapToObj(map, bean); list.add(bean); } } catch (Exception e) { e.printStackTrace(); } } return list; } private static BeanMap getBeanMap(Object obj){ BeanMap beanMap=null; String key=obj.getClass().getName(); if (BEAN_MAP.get(key)==null) { synchronized (BeanUtil.class) { if(BEAN_MAP.get(key)==null){ beanMap = BeanMap.create(obj); BEAN_MAP.put(key, beanMap); } } } else { beanMap =BEAN_MAP.get(key); } return beanMap; } }