专栏首页Java全栈自制CopyUtil优雅封装BeanUtils

自制CopyUtil优雅封装BeanUtils

本期为大家带来一个实用的对象复制工具类CopyUtil,优雅封装BeanUtils

喜欢听我叨叨的,直接看视频

制作CopyUtil优雅封装BeanUtils

01 场景介绍

通常情况下,一个项目会有很多的分层,比如经典的三层controller, server, mapper(dao)

在这些层之间传输数据,需要用到各种实体类,叫法不一,比如VO, DTO, ENTITY, DOMAIN等。所以,经常需要将数据从一个实体复制到另一个实体

02 最笨的方法

最笨的方法,当然就是一个一个set,花点力气,代码量多点,但是没有性能问题,如下:

// 功能:将UserDto数据拷贝到User,userDto是已有的变量
User user = new User();
user.setId(userDTO.getId());
user.setName(userDTO.getName());
user.set...

小提示:IDEA有个插件:GenerateAllSetter,可以快速生成一堆set

盗个图了:

03 使用BeanUtils

如果嫌一个一个的set麻烦,那么可以用BeanUtils。

Spring框架内置了一个BeanUtils工具类,可以实现对象的拷贝。

  • 优点:简单实用
  • 缺点:用到了反射,牺牲一点点性能,不是阿里那种体量的可以忽略

基本用法如下,是不是比最笨的set简洁多了:

// 功能:将UserDto数据拷贝到User,userDto是已有的变量
User user = new User();
BeanUtils.copyProperties(userDto, user);

如果是列表的复制,则循环调用copyProperties,看起来有点麻烦!用法如下:

// 功能:将List<UserDto>数据拷贝到List<User>,userDtoList是已有的变量
List<User> userList = new ArrayList<>();
for (int i = 0, l = userDtoList.size(); i < l; i++) {
    UserDto userDto = userDtoList.get(i);
    User user = new User();
    BeanUtils.copyProperties(userDto, user);
    userList.add(user);
}

除了广为人知的copyProperties用法外,还有其它关于类方法、属性的一些操作,具体就不演示,看方法名就知道了

04 自制CopyUtil

上面的BeanUtils写法还不够简洁,特别是列表复制,所以我自制了一个CopyUtil工具类,封装了BeanUtil,用起来超级简单,如下

  • 优点:更简单实用
  • 缺点:用到了反射,牺牲一点点性能,不是阿里那种体量的可以忽略

源码如下:

import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 公众号:甲蛙全栈,专注Java全栈技术分享
 * @author 甲蛙
 */
public class CopyUtil {

    /**
     * 对象复制
     */
    public static <T> T copy(Object source, Class<T> clazz) {
        if (source == null) {
            return null;
        }
        T obj = null;
        try {
            obj = clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        BeanUtils.copyProperties(source, obj);
        return obj;
    }

    /**
     * 列表复制
     */
    public static <T> List<T> copyList(List source, Class<T> clazz) {
        List<T> target = new ArrayList<>();
        if (!CollectionUtils.isEmpty(source)){
            for (Object c: source) {
                T obj = copy(c, clazz);
                target.add(obj);
            }
        }
        return target;
    }
}

05 使用示例

对象复制:

// 功能:将UserDto数据拷贝到User,userDto是已有的变量

// BeanUtils需要两行:
User user = new User();
BeanUtils.copyProperties(userDto, user);

// CopyUtil,只要一行:
User user = CopyUtil.copy(userDto, User.class);

列表复制:

// 功能:将List<UserDto>数据拷贝到List<User>,userDtoList是已有的变量

// BeanUtils需要好几行:
List<User> userList = new ArrayList<>();
for (int i = 0, l = userDtoList.size(); i < l; i++) {
    UserDto userDto = userDtoList.get(i);
    User user = new User();
    BeanUtils.copyProperties(userDto, user);
    userList.add(user);
}

// CopyUtil,只要一行:
List<User> userList = CopyUtil.copyList(userDtoList, User.class);

06 高频面试题

Q:你做过的项目中,有没有用过泛型,怎么使用的?

A:泛型经常用来写一些通用的类,比如工具类,上面提到的CopyUtil,或是一些数据实体类,用来存放一些不确实类型的数据。

Q:泛型和Object用法上有什么区别?

A:如果将泛型改为Object,则在使用这个工具类时,需要强制类型转换,有兴趣的可以试试。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用泛型制作CopyUtil封装BeanUtils

    泛型在框架中及为常见,我们在使用各种框架的时候,都会使用到泛型,具体看下面的例子。

    甲蛙全栈
  • (三)改掉这些坏习惯,还怕写不出优雅的代码?

    类似上面这种写法,if/else 就显得有点高射炮打蚊子,有的同学就会按照下面方式进行简化。

    一猿小讲
  • javaList集合的两种赋值方式

    在开发中难免会有entity,vo,dto之间的转换那么如何优雅快速的进行转换呢?当然你可以get在set显然不推荐这样做!

    许喜朝
  • EventBus的优雅封装

    EventBus是一款针对Android优化的发布/订阅事件总线。可以替代广播、startActivityForResult、Handler、异步回调等来实现各...

    蜻蜓队长
  • JavaWeb13-设计模式案例实现(Java真正的全栈开发)

    ? JavaWeb设计模式&案例 一.JavaWeb的设计模式 1. jsp模式介绍 SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一...

    Java帮帮
  • SpringBoot 如何进行对象复制,老鸟们都这么玩的!

    今天带来SpringBoot老鸟系列的第四篇,来聊聊在日常开发中如何优雅的实现对象复制。

    macrozheng
  • 如何优雅的封装requests

    后面定义了get/options/head/post/put/patch/delete 6个函数。

    dongfanger
  • BeanUtils、BeanCopier、Dozer、Orika 哪个性能最强?

    在分层的代码架构中,层与层之间的对象避免不了要做很多转换、赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils、...

    程序猿DD
  • BeanUtils开发包的使用

    对内省技术有了一定的了解之后,我们就可以来学习一下BeanUtils开发包的使用了。

    wangweijun
  • 字节流---复制文件和文件夹

    shimeath
  • 关于领域模型转换的那些事儿

    我们在软件开发设计及开发过程中,习惯将软件横向拆分为几个层。比如常见的三层架构:表现层(VIEW/UI)、业务逻辑层(SERVICE/BAL)、数据访问层(DA...

    端碗吹水
  • java基础加强之内省

    黑泽君
  • BeanUtils.copyProperties() 用法

    https://blog.csdn.net/jdjdndhj/article/details/62056137

    allsmallpig
  • Spring 工具类之基本元素判断

    实际业务开发中偶尔会遇到判断一个对象是否为基本数据类型,除了我们自老老实实的自己写之外,也可以借助 Spring 的 BeanUtils 工具类来实现

    一灰灰blog
  • Spring 工具类之基本元素判断

    实际业务开发中偶尔会遇到判断一个对象是否为基本数据类型,除了我们自老老实实的自己写之外,也可以借助 Spring 的 BeanUtils 工具类来实现

    一灰灰blog
  • 工作中的设计模式 —— 原型模式

    原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。

    程序员小航
  • Python学习(七):模块 优雅的封装

    第7 章 模块 优雅的封装 Table of Contents Python中的模块 使用模块 定义模块 建议 模块的安装 模块搜索路径 作用域 编程是一种美德...

    双鬼带单
  • 系统学习javaweb-08-学习速查案例02

    名称:酒店订餐系统 目的:常见的javaweb的一些写法总结 说明:未使用javaweb框架,数据使用mysql,根目录下有sql脚本,用户名密码写...

    csxiaoyao
  • Java世界最常用的工具类库

    Java世界有很多实用的工具类框架,今天介绍3个使用频率最高的框架。有很多实用的工具类并没有全部列出来,只列出了最基础的一部分,感兴趣的小伙伴,可以看官方的ap...

    Java识堂

扫码关注云+社区

领取腾讯云代金券