您的位置:首页 > 其它

对象之间进行属性值复制

2018-01-04 09:20 323 查看
commons-beanutils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作。

commons-beanutils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度,而BeanUtils解决了这个问题。

在使用BeanUtils工具包之前我们需要的Jar包有以下几种:

BeanUtils相关包:

commons-beanutils-1.8.3.jar

commons-beanutils-1.8.3-javadoc.jar

commons-beanutils-1.8.3-javadoc.jar

commons-beanutils-bean-collections-1.8.3.jar

commons-beanutils-core-1.8.3.jar

一、BeanUtils.copyProperties()的用法

如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm。例如:一个用户注册页面,有一个User实体类和一个UserActionForm,我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

[java] view
plain copy

// 获取 ActionForm 表单数据

UserActionForm uForm = (UserActionForm) form;

// 构造一个User对象

User user = new User();

// 逐一赋值

user.setUsername(uForm.getUsername);

user.setPassword(uForm.getPassword);

user.setAge(uForm.getAge);

...........

// 然后调用JDBC、或操作Hibernate 持久化对象User到数据库

...

通过这样的方法如果表单数据N多、100、1000(夸张点。哈哈)、、、、那我们不是要写100、、、1000行set、get了。谁都不愿意这样做。

而我们使用 BeanUtils.copyProperties() 方法以后,代码量大大的减少,而且整体程序看着也简洁明朗,代码如下:

[java] view
plain copy

// 获取 ActionForm 表单数据

UserActionForm uForm = (UserActionForm) form;

// 构造一个User对象

User user = new User();

// 赋值

BeanUtils.copyProperties(user, uForm);

// 然后调用JDBC、或操作Hibernate 持久化对象User到数据库

.......

注:如果两个复制的对象之间存在名称不的属性,则BeanUtils不对这些属性进行处理,需要手动处理。

spring中也有一个BeanUtils,其中实现的方式很简单,就是对两个对象中相同名字的属性进行简单get/set,仅检查属性的可访问性。

而commons-beanutils则施加了很多的检验,包括类型的转换,甚至于还会检验对象所属的类的可访问性。

BeanUtils支持的转换类型如下:

java.lang.BigDecimal
java.lang.BigInteger
boolean and java.lang.Boolean
byte and java.lang.Byte
char and java.lang.Character
java.lang.Class
double and java.lang.Double
float and java.lang.Float
int and java.lang.Integer
long and java.lang.Long
short and java.lang.Short
java.lang.String
java.sql.Date
java.sql.Time
java.sql.Timestamp

这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的,如果需要使用java.util.Date而且需要被转换的时候,可以自定义你的类的Converter。然后注册进去。

感觉commons-beanutils包中的这个BeanUtils类的copyProperties方法,太过复杂,约束太多,而且使用不便,虽然可扩展性好了,但是易用性不高。

二、commons-beanutils对于java.util.Date的转换

看下面的代码:

[java] view
plain copy

static {

[java] view
plain copy

<span style="color: rgb(0, 130, 0); font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; background-color: rgb(248, 248, 248);"><span style="white-space:pre"> </span> //注册一个日期转换器</span>

ConvertUtils.register(new Converter(){

@Override

public Object convert(Class type, Object value) {

// TODO Auto-generated method stub

if(value==null){

return null;

}

if(value instanceof Date){

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

String str = sdf.format((Date)value);

return str;

}

return value;

}

}, String.class);

}

方法中重写了convert方法,并自定义了Converter进行了注册,方法中判断了属性的真实类型是不是Date,如果是则通过SimpleDateFormat进行转换,转换定义的字符串格式,返之也可以将String格式化成Date,这样就解决了不支持Date的问题了。

总结:

关于bean复制,如果属性较少,建议直接写个方法完成get/set即可。如果属性较多,可以自己采用反射实现一个满足自己需要的工具类,或者使用spring的那个beanutils类,不建议使用commons-beanutils包中的那个BeanUtils类,刚看了下,这个类对于内部静态类的对象复制也会出现问题,检验太复杂了,常会出现一些诡异的问题。毕竟我们bean复制一般就是简单的属性copy而已。

而且,由于这些BeanUtils类都是采用反射机制实现的,对程序的效率也会有影响。因此,慎用BeanUtils.copyProperties!!!

引用:http://blog.csdn.net/caokai1992/article/details/50506252
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: