前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BeanCopierUtil 工具,比BeanUtil性能高

BeanCopierUtil 工具,比BeanUtil性能高

作者头像
无忧摸鱼
发布2022-05-31 11:20:21
6350
发布2022-05-31 11:20:21
举报
文章被收录于专栏:摸鱼天堂

package com.example.test.utils;

import net.sf.cglib.beans.BeanMap; import org.springframework.cglib.beans.BeanCopier; import org.springframework.objenesis.ObjenesisStd;

import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;

代码语言:javascript
复制
/**
  * @author bian lei
  * @version 1.0
  * @date 2020/4/23 18:55
  */
 public class BeanCopierUtil {
     private static ThreadLocal<ObjenesisStd> objenesisStdThreadLocal = ThreadLocal.withInitial(ObjenesisStd::new);
     private static ConcurrentHashMap<Class<?>, ConcurrentHashMap<Class<?>, BeanCopier>> cache = new ConcurrentHashMap<>();

     public static <T> T copy(Object source, Class<T> target) {
         return copy(source, objenesisStdThreadLocal.get().newInstance(target));
     }

     private static <T> T copy(Object source, T target) {
         BeanCopier beanCopier = getCacheBeanCopier(source.getClass(), target.getClass());
         beanCopier.copy(source, target, null);
         return target;
     }
    /**
      * 普通copy 集合
      *
      * @param sources
      * @param target
      * @param <T>
      * @return
      */
     public static <T> List<T> copyList(List<?> sources, Class<T> target) {
         if (sources.isEmpty()) {
             return Collections.emptyList();
         }
         ArrayList<T> list = new ArrayList<>(sources.size());
         ObjenesisStd objenesisStd = objenesisStdThreadLocal.get();
         for (Object source : sources) {
             if (source == null) {
                 return new ArrayList<>();
             }
             T newInstance = objenesisStd.newInstance(target);
             BeanCopier beanCopier = getCacheBeanCopier(source.getClass(), target);
             beanCopier.copy(source, newInstance, null);
             list.add(newInstance);
         }
         return list;
     }
    /**
      * 解决属性名相同、类型不同copy
      *
      * @param sources
      * @param target
      * @param <T>
      * @return
      */
 //    public static <T> List<T> depthCoptList(List<?> sources, Class<T> target) {
 //        if (sources.isEmpty()) {
 //            return Collections.emptyList();
 //        }
 //        for (Object source : sources) {
 //            source.getClass().getDeclaredFields();
 //        }
 //        return;
 //    }

     public static <T> T mapToBean(Map<?, ?> source, Class<T> target) {
         T bean = objenesisStdThreadLocal.get().newInstance(target);
         BeanMap beanMap = BeanMap.create(bean);
         beanMap.putAll(source);
         return bean;
     }

     public static <T> Map<?, ?> beanToMap(T source) {
         return BeanMap.create(source);
     }
    /**
      * 带缓存
      *
      * @param source
      * @param target
      * @param <S>
      * @param <T>
      * @return
      */
     private static <S, T> BeanCopier getCacheBeanCopier(Class<S> source, Class<T> target) {
         ConcurrentHashMap<Class<?>, BeanCopier> copierConcurrentHashMap = cache.computeIfAbsent(source, aClass -> new ConcurrentHashMap<>(16));
         return copierConcurrentHashMap.computeIfAbsent(target, aClass -> BeanCopier.create(source, target, false));
     }
}

如果想规避属性名相同,类型不同的坑,就需要用到反射,又会影响应性能

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档