服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 聊聊BeanUtils.copyProperties和clone()方法的区别

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

2021-12-13 13:32101之歌 Java教程

这篇文章主要介绍了聊聊BeanUtils.copyProperties和clone()方法的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

最近撸代码的时候发现有人将一个对象的值赋给另一个对象的时候,并没有使用常规的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包

?
1
2
3
4
5
6
7
8
9
10
<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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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类相同

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
        }
    }

执行结果

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

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

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

?
1
2
3
4
5
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.0.7.RELEASE</version>
</dependency>

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

Main方法

?
1
2
3
4
5
6
7
8
9
10
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());
    }

输出结果:

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @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();
    }
}

测试方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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的区别还有待学习

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qxf1374268/article/details/88125837

延伸 · 阅读

精彩推荐
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12