1.BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们在项目中经常使用到的PO对象和VO对象在很多情况下属性是相同的,通过BeanUtils.copyProperties() 方法可以减少程序员再次get/set方法的书写,BeanUtils.copyProperties()方法也有它的优缺点,下面我们通过程序来验证。 2.首先我们创建两个类:Studen.java和StudentVo.java两个类 Student.java package 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.java package 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.javapackage 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 block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } Long end = System.currentTimeMillis(); return end - start; } }
输出结果:使用Get/Set方法的结果: 0ms 2 zhangsan qweasd Shanghai ---------------------- 使用BeanUtils.copyProperties()方法的结果: 93ms 2 zhangsan qweasd
通过结果我们可以看出BeanUtils.copyProperties()方法可以很好的对Student类的属性进行copy,同时也把其中set的值获取到了。
但是我们看到效率比较低,使用get/set方法基本上没有消耗时间的,但是使用了BeanUtils.copyProperties()方法的耗时却达到了
99ms,这仅仅设置了几个属性,可以得知当属性的数量越来越多时消耗的时间就会变大;但是却省去了人工操作。
3.BeanUtils.copyProperties()方法的限制
只有当两个类的属性相同才会进行处理,对不同属性的不做处理;对java.util.Date类不支持,但是对java.sql.Date支持;对Integer,Boolean,Long类型不支持,
默认值为null,但是使用方法后默认值为0,所以要小心使用。使用的效率也比较低,所以要谨慎使用。当两个类在一起此方法不用,如下情况4.需要的jar包class StudentVo{ ..... } class Student{ ..... } public class Test { public static void main(String[] args) { ...... } }
commons-beanutils-*.jar
commons-logging-*.jar
BeanUtils.copyProperties()方法的用法及效率
最新推荐文章于 2024-08-17 10:47:43 发布