BeanCopier 浅复制工具类

本文介绍了一种用于Java对象间浅复制的工具类——PojoConvertUtil,该工具使用cglib库实现对象属性的快速复制,并支持单个对象、列表及分页列表的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package com.bestpay.messagecenter.oss.service;/**
 * Created by lxn on 2016/11/2.
 */

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import lombok.extern.slf4j.Slf4j;
import net.sf.cglib.beans.BeanCopier;

import com.bestpay.messagecenter.oss.dal.model.TSysRole;
import com.bestpay.messagecenter.oss.dal.model.TSysUser;
import com.bestpay.messagecenter.oss.service.model.dataEntity.UserVo;
import com.github.miemiedev.mybatis.paginator.domain.PageList;

/**
 * VoPo 转换工具(浅复制)
 * @author lxn
 * @version Id: VoPoUtil.java, v 0.1 2016/11/2 14:41 lxn Exp $$
 */
@Slf4j
public class PojoConvertUtil {

    private static Lock initLock =new ReentrantLock();

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

    /**
     * 初始化 BeanCopier
     * @param source
     * @param target
     * @return
     */
    private static BeanCopier initCopier(Class source,Class target){
        initLock.lock();
        BeanCopier find = beanCopierMap.get(source.getName()+"_"+target.getName());
        if(find!=null){
            initLock.unlock();
            return find;
        }
        BeanCopier beanCopier = BeanCopier.create(source,target,false);
        beanCopierMap.put(source.getName()+"_"+target.getName(),beanCopier);
        initLock.unlock();
        return beanCopier;
    }


    /**
     * 获取BeanCopier
     * @param source
     * @param target
     * @return
     */
    private static  BeanCopier getBeanCopier(Class source,Class target){
        BeanCopier beanCopier = beanCopierMap.get(source.getClass().getName()+"_"+target.getName());
        if(beanCopier!=null){
            return beanCopier;
        }
        return initCopier(source,target);
    }


    /**
     * Pojo 类型转换(浅复制,字段名&类型相同则被复制)
     * @param source
     * @param targetClass
     * @param <T>
     * @return
     */
    public static <T> T convert(Object source, Class<T> targetClass){
        if(source==null){
            return null;
        }
        BeanCopier beanCopier = getBeanCopier(source.getClass(),targetClass);
        try {
            T target = targetClass.newInstance();
            beanCopier.copy(source,target,null);
            return target;

        }catch (Exception e){
            log.error("对象拷贝失败,{}",e);
            throw new RuntimeException("对象拷贝失败"+source+"_"+targetClass);
        }
    }

    /**
     * Pojo 类型转换(浅复制,字段名&类型相同则被复制)
     * @param source
     * @param targetClass
     * @param <E>
     * @return
     */
    public static <E> List<E> convert(List source, Class<E> targetClass){
        if(source==null){
            return null;
        }
        try {
            if(source.isEmpty()){
                return source.getClass().newInstance();
            }
            List result = source.getClass().newInstance();

            for(Object each: source){
                result.add(convert(each,targetClass));
            }
            return result;
        }catch (Exception e){
            log.error("对象拷贝失败,{}",e);
            throw new RuntimeException("对象拷贝失败"+source+"_"+targetClass);
        }
    }

    /**
     * Pojo 类型转换(浅复制,字段名&类型相同则被复制)
     * @param source
     * @param targetClass
     * @param <T>
     * @return
     */
    public static <T> PageList<T> convert(PageList source,Class<T> targetClass){
        if(source==null){
            return null;
        }
        List<T> list  = convert((List)source,targetClass);
        PageList<T> result = new PageList<>(source.getPaginator());
        result.addAll(list);
        return result;
    }


    public static void main(String[] args) {

        TSysRole tSysRole =new TSysRole();
        tSysRole.setRoleDesc("12346");
        tSysRole.setRoleName("adcasdasd");
        tSysRole.setRoleId(187);
//
//        RoleVo result = PojoConvertUtil.convert(tSysRole, RoleVo.class);

//        List<TSysRole> org =  new ArrayList<>();
//        org.add(tSysRole);

        TSysUser tSysUser =new TSysUser();
        tSysUser.setRole(tSysRole);

        UserVo tar = PojoConvertUtil.convert(tSysUser,UserVo.class);
        System.out.println(tar);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值