对象属性复制几种方式

Posted 默默红尘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象属性复制几种方式相关的知识,希望对你有一定的参考价值。

对象属性复制的三种方法:

1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties两种方式

  BeanUtils.copyProperties("转换后的类", "要转换的类"); //多一步类型转换,比PropertyUtils效率还差

  PropertyUtils.copyProperties("转换后的类", "要转换的类");

  口诀:后付钱(后付前:后面的复制给前面)会抛异常

2.spring提供的BeanUtil.copyProperties方式

  BeanUtils.copyProperties("要转换的类", "转换后的类"); 

  和Apache参数顺序相反

3.cglib提供的copy方式

  BeanCopier copy=BeanCopier.create("要转换的类", "转换后的类"false);

  copy.copy(from, to, null);

4.spring提供的copy方式

  BeanCopier copy=BeanCopier.create("要转换的类", "转换后的类"false);

  copy.copy(from, to, null);

 

1 /**
2  * Created by hunt on 2017/6/28.
3  */
4 @Data
5 public class TestFrom {
6     private String name;
7 }
View Code

 

1 import lombok.Data;
2 
3 /**
4  * Created by hunt on 2017/6/28.
5  */
6 @Data
7 public class TestTo {
8     private String name;
9 }
View Code

第一种Apache方式的BeanUtils效率测试:

 1 import org.apache.commons.beanutils.BeanUtils;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 
 5 /**
 6  * Created by hunt on 2017/6/28.
 7  */
 8 public class TestDemo {
 9     public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
10         TestFrom testFrom = new TestFrom();
11         testFrom.setName("hunt");
12         TestTo testTo = new TestTo();
13         long begin = System.currentTimeMillis();
14         for (int i = 0; i <1000000 ; i++) {//一百万次
15             BeanUtils.copyProperties(testTo,testFrom);
16         }
17         long end = System.currentTimeMillis();
18         long mis = end -begin;
19         System.out.println("apache的BeanUtils.copyProperties耗时" + mis +"毫秒");
20         System.out.println(testTo);
21     }
22 }
View Code

第一种Apache方式的PropertyUtils效率测试:

 1 import org.apache.commons.beanutils.PropertyUtils;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 
 5 /**
 6  * Created by hunt on 2017/6/28.
 7  */
 8 public class TestDemo {
 9     public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
10         TestFrom testFrom = new TestFrom();
11         testFrom.setName("hunt");
12         TestTo testTo = new TestTo();
13         long begin = System.currentTimeMillis();
14         for (int i = 0; i <1000000 ; i++) {//一百万次
15             PropertyUtils.copyProperties(testTo,testFrom);
16         }
17         long end = System.currentTimeMillis();
18         long mis = end -begin;
19         System.out.println("apache的PropertyUtils.copyProperties耗时" + mis +"毫秒");
20         System.out.println(testTo);
21     }
22 }
View Code

第二种Spring方式的BeanUtils效率测试:

 1 import org.springframework.beans.BeanUtils;
 2 
 3 /**
 4  * Created by hunt on 2017/6/28.
 5  */
 6 public class TestDemo {
 7     public static void main(String[] args) {
 8         TestFrom testFrom = new TestFrom();
 9         testFrom.setName("hunt");
10         TestTo testTo = new TestTo();
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i <1000000 ; i++) {//一百万次
13             BeanUtils.copyProperties(testFrom,testTo);//没抛异常
14         }
15         long end = System.currentTimeMillis();
16         long mis = end -begin;
17         System.out.println("Spring的PropertyUtils.copyProperties耗时" + mis +"毫秒");
18         System.out.println(testTo);
19     }
20 }
View Code

第三种方式cglib的copy效率测试

 1 import net.sf.cglib.beans.BeanCopier;
 2 
 3 /**
 4  * Created by hunt on 2017/6/28.
 5  */
 6 public class TestDemo {
 7     public static void main(String[] args) {
 8         TestFrom testFrom = new TestFrom();
 9         testFrom.setName("hunt");
10         TestTo testTo = new TestTo();
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i <1000000 ; i++) {//一百万次
13             BeanCopier copier = BeanCopier.create(TestFrom.class,TestTo.class,false);
14             copier.copy(testFrom,testTo,null);
15         }
16         long end = System.currentTimeMillis();
17         long mis = end -begin;
18         System.out.println("cglib的copier.copy耗时" + mis +"毫秒");
19         System.out.println(testTo);
20     }
21 }
View Code

第四种方式Spring的copy效率测试

 1 import org.springframework.cglib.beans.BeanCopier;
 2 
 3 /**
 4  * Created by hunt on 2017/6/28.
 5  */
 6 public class TestDemo {
 7     public static void main(String[] args) {
 8         TestFrom testFrom = new TestFrom();
 9         testFrom.setName("hunt");
10         TestTo testTo = new TestTo();
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i <1000000 ; i++) {//一百万次
13             BeanCopier copier = BeanCopier.create(TestFrom.class,TestTo.class,false);
14             copier.copy(testFrom,testTo,null);
15         }
16         long end = System.currentTimeMillis();
17         long mis = end -begin;
18         System.out.println("Spring的copier.copy耗时" + mis +"毫秒");
19         System.out.println(testTo);
20     }
21 }
View Code

 

 

总结:这四种方式的效率是由低到高。(注意Apache的PropertyUtils不能进行类型转换的问题)

以上是关于对象属性复制几种方式的主要内容,如果未能解决你的问题,请参考以下文章

对象属性复制几种方式的效率

对象属性复制几种方式的效率

JS实现继承的几种方式

java对象的初始化过程和创建对象的几种方式

面试官:你知道几种对象属性拷贝方式,说来看看?

Json字符串与Object对象相互转换的几种方式