Cglib BeanCopier工具类

目录

前言

上代码

解析

github地址


前言

一般大家都会使用BeanUtils.copyProperties来复制对象,不过Cglib更快

所以今晚熬夜把这个工具类也封装一下,由于在创建BeanCopier会消耗很多时间,我们使用Map来储存BeanCopier

上代码

import com.example.demo.entity.User;
import com.example.demo.entity.UserVO;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * @author M
 *
 * 对象复制以及队列复制
 */
@Component
public class MyBeanUtils {

    private static Map<String, BeanCopier> map = new HashMap<>();

    /**
     * 对象复制
     * @param obj1 被复制对象,为空会抛出异常
     * @param classz 复制类型
     * @param <T>
     * @return
     */
    public static <T> T copyObject(Object obj1, Class<T> classz) {
        if (obj1 == null || classz == null) {
            throw new IllegalArgumentException("复制对象或者被复制类型为空!");
        }
        T obj2 = null;
        try {
            obj2 = classz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        String name = getClassName(obj1.getClass(), classz);
        BeanCopier beanCopier;
        if (map.containsKey(name)) {
            beanCopier = map.get(name);
        } else {
            beanCopier = BeanCopier.create(obj1.getClass(), classz, false);
            map.put(name, beanCopier);
        }
        beanCopier.copy(obj1, obj2, null);
        return obj2;
    }

    /**
     * 复制队列
     * @param list 被复制队列
     * @param classz 复制类型
     * @param <T>
     * @return
     */
    public static <T> List<T> copyList(List<?> list, Class<T> classz) {
        if (CollectionUtils.isEmpty(list)) {
            throw new IllegalArgumentException("被复制的队列为空!");
        }
        List<T> resultList = new LinkedList<>();
        for (Object obj1 : list) {
            resultList.add(copyObject(obj1, classz));
        }
        return resultList;
    }

    private static String getClassName(Class<?> class1, Class<?> class2) {
        return class1.getName() + class2.getName();
    }

    public static void main(String[] args) {
        User user = new User();
        user.setId(1L);
        user.setName("大鸡腿");
        User user1 = new User();
        user1.setId(2L);
        user1.setName("小鸡腿");
        UserVO vo = MyBeanUtils.copyObject(user, UserVO.class);
        System.out.println(vo);
        List<User> list = new ArrayList<>();
        list.add(user);
        list.add(user1);
        List<UserVO> list1 = MyBeanUtils.copyList(list, UserVO.class);
        System.out.println(list1);
    }


}

解析

  1. map用来储存BeanCopier,避免反复创建,消耗资源。
  2. 在复制对象以及队列时,如果为空会抛出异常,我可以返回一个null,或者空队列,为啥要报错呢?我们在使用的时候其实需要自己去判空来减少不必要的业务操作。如果说为了健壮性,返回一个实例或者空队列也行。自行改造
  3. 使用泛型来确保返回的对象类型和传入的类型一致

github地址

https://github.com/dajitui/MyCopy

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值