聊聊BeanUtils.copyProperties和clone()方法的区别

目录
  • 首先,BeanUtils有两种:
  • 效率:
  • 需要在pom文件中引入这个包
  • 在pom文件里面引入所需要的包
  • 新建一个实体类StudentEntity实现Cloneable接口
  • 测试方法

最近撸代码的时候发现有人将一个对象的值赋给另一个对象的时候,并没有使用常规的set/get方法去给对象赋值,而是采用BeanUtils.copyProperties(A,B)这个方法去赋值,但是有的还是有局限性,比如Date类型的值无法赋值,只能赋值为null,所以我大致百度了一下,作为记录。

首先,BeanUtils有两种:

org.springframework.beans和org.apache.commons.beanutils,前面是spring的,后面是apache公司的。

效率:

传统的set/get>spring的>apache的

我们首先来使用一下效率最慢的org.apache.commons.beanutils

需要在pom文件中引入这个包

并且要配合第三方的日志工具来使用,一般都是使用的是common logging包

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.2</version>
</dependency>

在引入完成之后,我们新建一个类TestBean,里面有两个属性,userName和password

    private String userName;
    private String password;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

然后我们再新建一个类CopyBean,这个类中的属性和上面的TestBean类相同

 private String userName;
    private String password;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

然后我们写我们的main方法

public static void main(String[] args) {
        TestBean bean = new TestBean();
        bean.setUserName("qxf");
        bean.setPassword("123");
        CopyBean copyBean = new CopyBean();
        try {
   //这个地方如果你安装了阿里的代码检测控件的话,会报错,提示你使用spring的BeanUtils,而不要使用apache的BeanUtils
            BeanUtils.copyProperties(copyBean,bean);
            System.out.println(copyBean.getUserName());
            System.out.println(copyBean.getPassword());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

执行结果

接下来我们再来使用一下spring的org.springframework.beans

在pom文件里面引入所需要的包

		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>

然后新建CopyBean和TestBean两个类,这两个和上述的相同,因此在此不再赘述

Main方法

public static void main(String[] args) {
        TestBean bean = new TestBean();
        bean.setUserName("qxf");
        bean.setPassword("123");
        CopyBean copyBean = new CopyBean();
        //这个和apache的恰恰相反,具体的原因需要查看源码才可以理解
        BeanUtils.copyProperties(bean,copyBean);
        System.out.println(copyBean.getUserName());
        System.out.println(copyBean.getPassword());
    }

输出结果:

可见两者实现的结果是相同的,但是两者的效率是不一样的

而我们在看clone()方法的时候,发现也是类似的,也可以将对象中的属性copy到另一个对象的属性中

新建一个实体类StudentEntity实现Cloneable接口

/**
* @Description:
* @Author: qxf
* @Date: 2019/2/21 2:22 PM
*/
public class StudentEntity implements Cloneable {
    private String userName;
    private String passWord;
    private List<String> list;
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

测试方法

public void testClone(){
        //测试clone方法
        StudentEntity entity = new StudentEntity();
        entity.setUserName("qxf");
        entity.setPassWord("test");
        List<String> list = new ArrayList<>();
        list.add("Test1");
        list.add("Test2");
        list.add("Test3");
        list.add("Test4");
        entity.setList(list);
        try {
            StudentEntity entityClone = (StudentEntity) entity.clone();
            System.out.println(entityClone.getUserName());
            System.out.println(entityClone.getPassWord());
            List<String> entityList = new ArrayList<>();
            entityList = entityClone.getList();
            for (int i=0;i<entityList.size();i++){
                System.out.println(entityList.get(i));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

但是clone()的方法和copyProperties的区别还有待学习

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java BeanUtils.copyProperties的详解

    场景 开发中经常遇到,把父类的属性拷贝到子类中.通常有2种方法: 1.一个一个set 2.用BeanUtils.copyProperties 很显然BeanUtils更加方便,也美观很多. 那么任何情况都能使用BeanUtils么,当然不是.要先了解他. BeanUtils是深拷贝,还是浅拷贝? 是浅拷贝. 浅拷贝: 只是调用子对象的set方法,并没有将所有属性拷贝.(也就是说,引用的一个内存地址) 深拷贝: 将子对象的属性也拷贝过去. 什么情况适合用BeanUtils 如果都是单一的属性,那么

  • 基于Beanutils.copyProperties()的用法及重写提高效率

    目录 Beanutils.copyProperties()用法及重写提高效率 一.简介 二.用法 三.重写 原理 BeanUtils.copyProperties 使用注意 示例演示 开始进行示例 最后强调 Beanutils.copyProperties()用法及重写提高效率 特别说明本文介绍的是Spring(import org.springframework.beans.BeanUtils)中的BeanUtils.copyProperties(A,B)方法.是将A中的值赋给B.apache

  • BeanUtils.copyProperties复制不生效的解决

    目录 前言 问题的排查 问题的扩展 前言 呵呵 前端时间使用 BeanUtils.copyProperties 的时候碰到了一个这样的问题 我有两个实体, 有同样的属性, 一个有给定的属性的 getter, 另外一个有 给定的属性的 setter, 但是 我使用 BeanUtils.copyProperties 的时候 把来源对象的这个属性 复制不到 目标对象上面 然后 当时也跟踪了一下代码, 然后 这里整理一下 改代码片段吧 然后在调试的过程中 也发现了一些其他的问题, 呵呵 算是额外的了解吧

  • BeanUtils.copyProperties使用总结以及注意事项说明

    目录 1.前言 2.一般使用 3.拷贝属性时忽略空值 4.使用注意事项(1) 5.使用注意事项(2) 6.使用注意事项(3) 1.前言 开发过程中,讲一个对象的属性和值赋值到另一个对象上,大量使用了get.set方法,看着很臃肿,思考下肯定不只有我有这种想法,所以技术上肯定有方法能解决这个问题,所以查阅了一些资料发现了BeanUtils.copyProperties这个方法以下是这次所有的总结以及使用时的注意事项. 使用org.springframework.beans.BeanUtils.co

  • BeanUtils.copyProperties复制属性失败的原因及解决方案

    目录 BeanUtils.copyProperties复制属性失败 描述 解决办法 BeanUtils.copyProperties应用的改进 为解决这个问题我重写了部分spring BeanUtils的代码 BeanUtils.copyProperties复制属性失败 描述 在JavaE中使用 BeanUtils.copyProperties,把A对象的name.age等属性复制到B对象中,A与B对象的类型不同.出现的问题是复制属性失败,根本原因是 BeanUtils找不到set.get方法.

  • BeanUtils.copyProperties()参数的赋值顺序说明

    目录 BeanUtils.copyProperties()参数的赋值顺序 BeanUtils.copyProperties初体验,及其参数含义解释 用处 案例: 创建一个源类:source 创建一个目标target源类 创建测试类test ignoreProperties参数 案例 案例测试 BeanUtils.copyProperties()参数的赋值顺序 BeanUtils.copyProperties(x,y)有两个不同的jar包,引入不同的包,赋值的顺序不一样. 分别是: org.spr

  • 解决BeanUtils.copyProperties之大坑

    目录 BeanUtils.copyProperties大坑 BeanUtils.copyProperties() 用法及区别 因为两个类引入了两个不同的BeanUtils类 例如 BeanUtils.copyProperties大坑 两个不同的包(springframework , apache)中有一个相同名字的类,相同的方法,方法的作用相同,参数个数相同.就是参数位置不同,是相反的.? import org.springframework.beans.BeanUtils; import or

  • BeanUtils.copyProperties()拷贝id属性失败的原因及解决

    目录 BeanUtils.copyProperties()拷贝id属性失败 部分代码如下 解决方法 BeanUtils.copyProperties 出错 BeanUtils.copyProperties()拷贝id属性失败 po类中id有值,但是使用BeanUtils.copyProperties()拷贝出的vo类id属性为null,检查后发现是因为po继承的父类声明了一个泛型. 部分代码如下 public abstract class AbstractEntity<ID extends Se

  • 聊聊BeanUtils.copyProperties和clone()方法的区别

    目录 首先,BeanUtils有两种: 效率: 需要在pom文件中引入这个包 在pom文件里面引入所需要的包 新建一个实体类StudentEntity实现Cloneable接口 测试方法 最近撸代码的时候发现有人将一个对象的值赋给另一个对象的时候,并没有使用常规的set/get方法去给对象赋值,而是采用BeanUtils.copyProperties(A,B)这个方法去赋值,但是有的还是有局限性,比如Date类型的值无法赋值,只能赋值为null,所以我大致百度了一下,作为记录. 首先,BeanU

  • 关于两个BeanUtils.copyProperties()的用法及区别

    目录 两个BeanUtils.copyProperties()用法及区别 使用Beanutils.copyProperties()遇到的问题 两个BeanUtils.copyProperties()用法及区别 这两个类在不同的包下面,而这两个类的copyProperties()方法里面传递的参数赋值是相反的. 例如: a,b为对象 BeanUtils.copyProperties(a, b); public static void copyProperties(Object source, Ob

  • DataTable类Clone方法与Copy方法的区别分析

    DataTable.Clone 方法:克隆 DataTable 的结构,包括所有 DataTable 架构和约束. DataTable.Copy 方法:复制该 DataTable 的结构和数据. 我们可以编写如下的程序,进行验证: 复制代码 代码如下: static string connStr = "Server=.\\sqlexpress;Initial Catalog=hr;Integrated Security=True"; static void Clone()       

  • 解决BeanUtils.copyProperties不支持复制集合的问题

    工作中,经常使用Spring的工具类BeanUtils.copyProperties对bean属性进行复制,这里的复制属于浅复制.且不能复制集合和数组.本文会对该工具进行一些测试. 文末会提出复制集合属性的解决方案 准备工作:准备测试需要的类 @Data public class Class { private People[] member; private People teacher; private List<People> student; } @Data @NoArgsConstr

  • BeanUtils.copyProperties()所有的空值不复制问题

    目录 BeanUtils.copyProperties()所有的空值不复制 第一种情况 第二种情况 BeanUtils.copyProperties()的用法和注意点 属性为null也会被复制,内部类不会复制过去 注意点一 注意点二 BeanUtils.copyProperties()所有的空值不复制 第一种情况 所有为空值的属性都不copy 直接上代码吧~ public class UpdateUtil { /** * 所有为空值的属性都不copy * * @param source * @p

  • BeanUtils.copyProperties复制对象结果为空的原因分析

    目录 BeanUtils.copyProperties复制对象结果为空原因 正确的包 错误的包 两个类的区别 BeanUtils.copyProperties拷贝没成功的坑,记录解决原因 具体如下 BeanUtils.copyProperties复制对象结果为空原因 细心比对,发现原来是导错了包导致的 正确的包 import org.springframework.beans.BeanUtils; 错误的包 import org.apache.commons.beanutils.BeanUtil

随机推荐