Java中BeanUtils.copyProperties基本用法与小坑

 更新时间:2023年04月26日 10:36:57   作者:凉拌海蜇丝  
本文主要介绍了Java中BeanUtils.copyProperties基本用法与小坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

(1)实际应用

BeanUtils.copyProperties(赋值目标对象,模板源对象);
我们都知道当有两个对象AB,属性名称一样的情况下,如果需要把A的全部属性给B,传统写法是:

B.setXX(A.getXX());

如果只有几个特别的参数需要赋值过去这样写没问题,如果AB有100个参数需要粘过去,那么代码就太冗余太长了,BeanUtils.copyProperties就是为了解决这个问题的,现在假设有AB两个对象:

static class DemoA {
    private String name;
    private int sex;
    private int phone;
}

static class DemoB {
    private String name;
    private int sex;
    private int phone;
}

测试main方法:

public static void main(String[] args) throws Exception {
    DemoA a = new DemoA();
    DemoB b = new DemoB();
    a.setName("jojo");
    a.setPhone(12306);
    a.setSex(1);

    BeanUtils.copyProperties(b,a);
    System.out.println("b: "+b.getName()+b.getPhone()+b.getSex());
}

(2) 使用要注意的小坑

1:如果AB都是或者有一个是static的,赋值都会失败


 

2:注意引入的包

import org.apache.commons.beanutils.BeanUtils;

之前手快引错了,死活拿不出来,浪费了一点时间Debug
如果用的是springframework的这个方法,记住复制对象和源对象位置是刚好相反。千万注意自己引入的哪个BeanUtil,写对应参数位置。

3:不提供get,set方法

public static void main(String[] args) throws Exception {
    DemoA a = new DemoA("jojo",1,12306);
    DemoB b = new DemoB();

    BeanUtils.copyProperties(b,a);
    System.out.println("b: "+b.toString());
}

赋值失败

为什么呢?因为,它底层是通过反射获取对象里面的每个属性,再通过get,set获取和设值,不提供get,set,就当然没办法复制了。

4:加@Data注解

我们知道lombok.Data包中的@Data注解可以帮助我们省去get,set方法,那么不写getset,加@Data行不行?

结果是可以的,我个人理解的注解的本质就是切面编程,把一些固定的逻辑通过增强型代理类配置进去,外部在使用的时候也就是使用增强型代理类的方法,而@Data类似一些省事的语法糖,帮助我们“写”了那堆get,set方法供别人调用。

5:参数名不一致的,不能复制成功

注意,参数名必须严格一致,例如:A.name 对应 B.name,如果是B.nAme或者B.names,那就肯定不行了!
如果刚好两个实体类参数名不一致,怎么办呢?那只能用老的写法B.setNames(A.getName());

(3)以springframework.beans的BeanUtils.copyProperties为例,快速看几眼源码,不难理解

第一个参数是源,第二个参数是目标对象

红色方法就是反射创建对象方法

到此这篇关于Java中BeanUtils.copyProperties基本用法与小坑的文章就介绍到这了,更多相关BeanUtils.copyProperties用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker 解决openjdk容器里无法使用JDK的jmap等命令问题

    Docker 解决openjdk容器里无法使用JDK的jmap等命令问题

    这篇文章主要介绍了Docker 解决openjdk容器里无法使用JDK的jmap等命令问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • SpringBoot集成Kaptcha验证码的详细过程

    SpringBoot集成Kaptcha验证码的详细过程

    Kaptcha是一个强大而灵活的Java验证码生成库,通过合理的配置和使用,它可以有效地提高web应用的安全性,防止自动化程序的滥用,这篇文章主要介绍了SpringBoot集成Kaptcha验证码,需要的朋友可以参考下
    2024-07-07
  • Mybatis Plus 自定义方法实现分页功能的示例代码

    Mybatis Plus 自定义方法实现分页功能的示例代码

    这篇文章主要介绍了Mybatis Plus 自定义方法实现分页功能的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • dubbo 如何使用logback来输出日志

    dubbo 如何使用logback来输出日志

    这篇文章主要介绍了dubbo 如何使用logback来输出日志的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • springboot如何集成Minio文件服务器

    springboot如何集成Minio文件服务器

    这篇文章主要介绍了springboot如何集成Minio文件服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 基于MyBatis的parameterType传入参数类型

    基于MyBatis的parameterType传入参数类型

    这篇文章主要介绍了基于MyBatis的parameterType传入参数类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java 多线程传值的四种方法

    Java 多线程传值的四种方法

    这篇文章主要介绍了Java 多线程传值的四种方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • 简单易懂Java反射的setAccessible()方法

    简单易懂Java反射的setAccessible()方法

    本文主要介绍了简单易懂Java反射的setAccessible()方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java通过poi解析word入门的操作方法

    java通过poi解析word入门的操作方法

    Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目,可以使用POI在Java程序中对Miscrosoft Office各种文件进行读写操作,本文给大家介绍java通过poi解析word入门的操作方法,感兴趣的朋友一起看看吧
    2024-08-08
  • JPA如何使用nativequery多表关联查询返回自定义实体类

    JPA如何使用nativequery多表关联查询返回自定义实体类

    这篇文章主要介绍了JPA如何使用nativequery多表关联查询返回自定义实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论