BeanUtils.copyProperties()方法的用法及效率

来源:互联网 发布:手机音频制作软件 编辑:程序博客网 时间:2024/04/30 00:38
1.BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们在项目中经常使用到的PO对象和VO对象在很多情况下属性是相同的,通过BeanUtils.copyProperties()方法可以减少程序员再次get/set方法的书写,BeanUtils.copyProperties()方法也有它的优缺点,下面我们通过程序来验证。2.首先我们创建两个类:Studen.java和StudentVo.java两个类Student.javapackage my.test;public class Student {private Integer id;private String sName;private String sPwd;private String sAddress;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getsName() {return sName;}public void setsName(String sName) {this.sName = sName;}public String getsPwd() {return sPwd;}public void setsPwd(String sPwd) {this.sPwd = sPwd;}public String getsAddress() {return sAddress;}public void setsAddress(String sAddress) {this.sAddress = sAddress;}}StudentVo.javapackage my.test;public class StudentVo {private Integer id;private String sName;private String sPwd;private String sAddress;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getsName() {return sName;}public void setsName(String sName) {this.sName = sName;}public String getsPwd() {return sPwd;}public void setsPwd(String sPwd) {this.sPwd = sPwd;}public String getsAddress() {return sAddress;}public void setsAddress(String sAddress) {this.sAddress = sAddress;}}

可以看出这两个类的属性相同
Test.java
package my.test;import java.lang.reflect.InvocationTargetException;import org.apache.commons.beanutils.BeanUtils;public class Test {public static void main(String[] args){Student stu = new Student();stu.setId(2);stu.setsName("zhangsan");stu.setsAddress("Shanghai");stu.setsPwd("qweasd");StudentVo stuVo = new StudentVo();Long start = System.currentTimeMillis();stuVo.setId(stu.getId());stuVo.setsName(stu.getsName());stuVo.setsPwd(stu.getsPwd());stuVo.setsAddress(stu.getsAddress());Long end = System.currentTimeMillis();Long time2 = end - start;System.out.println("使用Get/Set方法的结果:");System.out.println(time2 + "ms");System.out.println(stuVo.getId());System.out.println(stuVo.getsName());System.out.println(stuVo.getsPwd());System.out.println(stuVo.getsAddress());System.out.println("----------------------");Long time1 = useCoryProperties(stuVo, stu);System.out.println("使用BeanUtils.copyProperties()方法的结果:");System.out.println(time1 + "ms");System.out.println(stuVo.getId());System.out.println(stuVo.getsName());System.out.println(stuVo.getsPwd());System.out.println(stuVo.getsAddress());//System.out.println(stuVo.getDate());}private static Long useCoryProperties(Object a, Object b){Long start = System.currentTimeMillis();try {BeanUtils.copyProperties(a, b);} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}Long end = System.currentTimeMillis();return end - start;}}


 输出结果:
使用Get/Set方法的结果:0ms2zhangsanqweasdShanghai----------------------使用BeanUtils.copyProperties()方法的结果:93ms2zhangsanqweasd



通过结果我们可以看出BeanUtils.copyProperties()方法可以很好的对Student类的属性进行copy,同时也把其中set的值获取到了。
但是我们看到效率比较低,使用get/set方法基本上没有消耗时间的,但是使用了BeanUtils.copyProperties()方法的耗时却达到了
99ms,这仅仅设置了几个属性,可以得知当属性的数量越来越多时消耗的时间就会变大;但是却省去了人工操作。

3.BeanUtils.copyProperties()方法的限制
只有当两个类的属性相同才会进行处理,对不同属性的不做处理;对java.util.Date类不支持,但是对java.sql.Date支持;对Integer,Boolean,Long类型不支持,
默认值为null,但是使用方法后默认值为0,所以要小心使用。使用的效率也比较低,所以要谨慎使用。当两个类在一起此方法不用,如下情况
    class StudentVo{          .....      }      class Student{          .....      }            public class Test {          public static void main(String[] args) {              ......          }      }  
4.需要的jar包
commons-beanutils-*.jar
commons-logging-*.jar



                                             
0 0
原创粉丝点击