好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

首先,BeanUtils有两种:

org.springframework.beans和org.apache测试数据mons.beanutils,前面是spring的,后面是apache公司的。

效率:

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

我们首先来使用一下效率最慢的org.apache测试数据mons.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();

         }

     }

执行结果

接下来我们再来使用一下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());

     }

输出结果:

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

而我们在看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

查看更多关于聊聊BeanUtils.copyProperties和clone()方法的区别的详细内容...

  阅读:14次