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

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.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 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,所以要小心使用。使用的效率也比较低,所以要谨慎使用。当两个类在一起此方法不用,如下情况
    class StudentVo{  
        .....  
    }  
    class Student{  
        .....  
    }  
      
    public class Test {  
        public static void main(String[] args) {  
            ......  
        }  
    }  
4.需要的jar包
commons-beanutils-*.jar
commons-logging-*.jar


 
 

 

                
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值