对象之间进行属性值复制
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
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
相关文章推荐
- commons-beanutils的使用【在对象之间进行属性值复制】
- java不同对象之间同名属性值复制
- java 对象之间属性值复制
- java 对象之间属性值复制
- $.each遍历对象、数组的属性值并进行处理
- 使用SqlBulkCopy对象进行大容量复制数据出现Datardader已经存在的错误的解决方法
- js sort方法根据数组中对象的某一个属性值进行排序
- 在不同的classloader之间进行对象的序列化和反序列化
- Java之使用json-lib进行对象与json字符串之间的转换
- js sort方法根据数组中对象的某一个属性值进行排序
- 使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝
- 客户端和应用服务器之间利用HttpClient和Servlet交互JSON对象进行通信
- 使用Oracle DBLink进行数据库之间对象的訪问操作
- 利用序列化与反序列化对Java对象进行深度复制
- pb9实现在两个工作簿之间进行工作表复制
- java对象复制和属性值复制工具类
- 利用xstream进行java对象和xml之间的互相转化
- Java之使用json-lib进行对象与json字符串之间的转换
- 使用Oracle DBLink进行数据库之间对象的访问操作
- $.each遍历对象、数组的属性值并进行处理