beancopier 深拷贝_对象的拷贝有几种方法

beancopier 深拷贝_对象的拷贝有几种方法BeanCopier对象拷贝packagecom.xmsme.nicsp.monitor.util;importjava.util.List;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;importorg.springframework.cglib.beans.BeanCopier;/***BeanCopier工具类**@authorzwy*/public…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 

BeanCopier 对象拷贝

  1. 对象拷贝转为其他类的对象
  2. 对象数组拷贝转为其他类的对象数组

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.cglib.beans.BeanCopier;

/**
 * BeanCopier工具类
 *
 * @author zwy
 */
public class BeanCopierUtil {
    private static Map<String, BeanCopier> beanCopierMap = new ConcurrentHashMap<>();

    /**
     * 初始化 BeanCopier
     *
     * @param source
     * @param target
     * @return
     */
    private static BeanCopier initCopier(Class source, Class target) {
        BeanCopier beanCopier = BeanCopier.create(source, target, false);
        beanCopierMap.put(source.getName() + "_" + target.getName(), beanCopier);
        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.getDeclaredConstructor().newInstance();
            beanCopier.copy(source, target, null);
            return target;

        } catch (Exception 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().getDeclaredConstructor().newInstance();
            }
            List result = source.getClass().getDeclaredConstructor().newInstance();

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


}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197189.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows 10出现0xc0000225错误代码如何解决?「建议收藏」

    Windows 10出现0xc0000225错误代码如何解决?「建议收藏」在使用Windows10系统的过程中,有的用户启动电脑时可能会遇到黑屏或蓝屏的0xc0000225错误提示。当出现0xc0000225错误代码时,要如何解决呢?本文提供多种解决方法。

    2022年4月19日
  • mac linux 虚拟机(虚拟机的ubuntu怎么连不上网)

    查看原文1.设置虚拟机网格为 NAT模式2.在Mac系统里打开终端(快捷键:Ctrl+Alt+T),输入ifconfig,查看Mac机的ip3.进入虚拟机设置网络,手动配置IPv4,xxx.xxx.xxx.2是固定的路由及DNS的ip4.关闭网络再打开即可访问外网5.结果

    2022年4月15日
  • 《使用QSortFilterProxyModel实现QTreeView行列过滤》:系列教程之十

    《使用QSortFilterProxyModel实现QTreeView行列过滤》:系列教程之十一、QSortFilterProxyModel简介QSortFilterProxyModel的使用比较简单,我们在上一章,使用它来实现排序时,已经大概使用过了。本章我们主要使用它实现对QTreeView中行列的筛选过滤。它是一个model代理类,需要配合原始数据model使用。我们先来看看QSortFilterProxyModel的设置过滤器函数,如下:voidsetFilterRegExp(constQRegExp&regExp);参数QRegExp正则表达式类,其构造函数,包括p

    2022年6月1日
  • 反射型xss实战演示「建议收藏」

    反射型xss实战演示「建议收藏」我们知道,XSS攻击大致分为三种类型:Persistent型(持久型),Non-persistent(反射型)及Dom-based型。而反射型是最常用,也是使用得最广的一种攻击方式。它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。   今天,通过一个反射型xss的实战演示

    2022年6月11日
  • java中string转date类型_cookie和session区别

    java中string转date类型_cookie和session区别注意事项格式描述字符串为”yyyy-MM-dd”特别提醒:月份描述字符串为大写的M。importjava.text.SimpleDateFormat;importjava.util.Date;publicDatedateFromString(StringdateStr){ SimpleDateFormatsimpleDateFormat=newSimp…

    2022年10月3日
  • virsh命令详解_1个无法解析的外部命令

    virsh命令详解_1个无法解析的外部命令virsh的详细命令解析virsh有命令模式和交互模式如果直接在vrish后面添加参数是命令模式,如果直接写virsh,就会进入交互模式virshlist 列出所有的虚拟机,虚拟机的状态有(8)种 runing是运行状态 idel是空闲状态 pause暂停状态 shutdown关闭状态 crash虚拟机崩坏状态 daying垂死状态 shutoff不运行完全关闭 pmsuspe…

    2022年8月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号