本文主要介绍java Beanutils.copyProperties()的用法,通过示例代码非常详细。对大家的学习或工作都有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。
这是一个开发自卫稿~ ~ ~ ~
昨天,测试小姐重新打开了我的一个bug列表,emmmm.内心OS:调整一个对象的属性类型这么简单的操作,我怎么会出错呢?一定不是我的锅!但是无论你怎么抗拒,bug还是要改的。毕竟晚上就要出版本了~ ~
老老实实的跟着我前天改的那部分。嗯,很完美,什么都不缺~ ~但是应该是成功的测试数据,接口返回的结果确实是假的。还是老老实实调试吧。
一步一步来,嗯,多顺口,就说一定不是我的锅~ ~呃?不,为什么这里的ID值为空?传递一些有价值的东西!原来是别人在修复bug的时候用了Beanutils.copyProperties (obj1,obj2),但是因为obj1中的属性名id,obj2中的属性名afterId,又因为Beanutils.copyProperties()要求要处理的两个对象的属性名相同,所以可以正常赋值。好了,今天就来说说beanutils.copyproperties()吧~
1、简介
BeanUtils为Java反射和自省API提供打包。它的主要目的是使用反射机制来处理JavaBean的属性。
2、用法
如果有两个JavaBean有很多相同的属性,一个很常见的情况就是PO对象(持久对象)和Struts中对应的ActionForm。例如,用户注册页面有一个用户实体类和一个UserActionForm实体类。我们通常从ActionForm构造一个PO对象。传统的方法是使用如下语句将值逐个分配给属性:
//获取ActionForm表单数据
user actionform u form=(user actionform)form;
//构造一个用户对象
User User=new User();
//逐个赋值
user . set username(u form . get username);
user . set password(u form . get password);
user . setage(u form . getage);
..
..
//然后调用JDBC,或者操作Hibernate将对象用户持久化到数据库中。
.
用这种方法,如果表单中的属性字段很多,达到100、1000甚至更多,那么我们就不用写100、1000行的set和get了。没人想这么做。
但是我们使用BeanUtils.copyProperties()方法后,代码量大大减少,整个程序看起来简洁明了。代码如下:
//获取ActionForm表单数据
user actionform u form=(user actionform)form;
//构造一个用户对象
User User=new User();
//赋值
BeanUtils.copyProperties(user,u form);
//然后调用JDBC,或者操作Hibernate将对象用户持久化到数据库中。
.
注意:如果User和UserActionForm之间有不同名称的属性,这些属性将不会被BeanUtils处理,需要手动处理。例如:
在User类中有一个createDate创建时间字段,但是在UserActionForm中没有这样的字段。BeanUtils.copyProperties()不会对此字段做任何事情。你必须手动处理。
用法总结如下:
[java]查看普通副本打印?
BeanUtils.copyProperties('要转换的类','已转换的类');
[java]查看普通副本打印?
PropertyUtils.copyProperties('要转换的类','已转换的类');
其实用法很简单。第一个参数是要转换的类,第二个参数是转换后的类。
BeanUtils.copyProperties VS PropertyUtils.copyProperties
两者最大的区别是:
BeanUtils.copyProperties进行类型转换,但PropertyUtils.copyProperties不进行类型转换。
由于执行类型转换,BeanUtils.copyProperties的速度不如PropertyUtils.copyProperties快
因此,PropertyUtils.copyProperties的应用程序副本略窄。它只复制具有相同名称和类型的属性,如果名称相同但类型不同,它将报告一个错误。
使用BeanUtils有几个要注意的地方:
1.对于boolean/short/integer/float/double类型的属性,它将被转换为0:
公共类用户{
私有整数intVal
私人双双Val
私人短期短期;
列兵朗格瓦尔
私有浮动浮动;
私有字节byteVal
私有布尔布尔瓦尔
}
User src=new User();
User dest=new User();
BeanUtils.copyProperties(dest,src);
系统。出去。println(src);
系统。出去。println(dest);
//输出
User [intVal=null,doubleVal=null,shortVal=null,longVal=null,floatVal=null,byteVal=null,booleanVal=null]
User [intVal=0,doubleVal=0.0,shortVal=0,longVal=0,floatVal=0.0,byteVal=0,booleanVal=false]
在stackoverflow上有人解释说是因为这几个类型都有对应的基本类型,在进行类型转换时,有可能遇到类似整数-整数的转换,此时显然不能对(同国际组织)国际组织类型的属性赋值为空,因此统一转换为0。
如何让它不要转为0呢?可以这样:
导入组织。阿帕奇。公地。豆制品。转换器。整数转换器;
整数转换器converter=新的整数转换器(null);//默认为空,而不是0
BeanUtilsBean BeanUtilsBean=new BeanUtilsBean();
beanUtilsBean.getConvertUtils().寄存器(转换器,整数。类);
2.对于Java。util。日期/大十进制/Java。SQL。日期/Java。SQL。时间戳/Java。SQL。时间这几个类,如果值为空,则在复制时会抛异常,需要使用对应的转换器:
公共类用户2 {
私人Java。util。日期javaUtilDateVal
私人Java。SQL。date javaSqlDateVal
私人Java。SQL。时间戳javasql时间戳val
私有BigDecimal BigDecimal val
私有Java。SQL。time Java SQL时间;
}
user 2 src=新用户2();
user 2 dest=新用户2();
BeanUtilsBean BeanUtilsBean=new BeanUtilsBean();
//如果没有下面几行,则在转换空时会抛异常,例如:org。阿帕奇。公地。豆制品。转换异常:没有为'大十进制'指定值
//在org。阿帕奇。公地。豆制品。转换器这个包下面有很多的转换器,可以按需要使用
beanUtilsBean.getConvertUtils().注册(新组织。阿帕奇。公地。豆制品。转换器。bigdecimal转换器(null)。类);
beanUtilsBean.getConvertUtils().注册(新组织。阿帕奇。公地。豆制品。转换器。日期转换器(空),Java。util。约会。类);
beanUtilsBean.getConvertUtils().注册(新组织。阿帕奇。公地。豆制品。转换器。sqltimestampconverter(null),Java。SQL。时间戳。类);
beanUtilsBean.getConvertUtils().注册(新组织。阿帕奇。公地。豆制品。转换器。sqldate转换器(空),Java。SQL。约会。类);
beanUtilsBean.getConvertUtils().注册(新组织。阿帕奇。公地。豆制品。转换器。sqltimeconverter(null),Java。SQL。时间。类);
beanutilsbean。复制属性(dest,src);
系统。出去。println(src);
系统。出去。println(dest);
使用BeanUtils还会经常碰到这样变态的需求:
假设是从A复制到乙:
需求1:如果B中某字段有值(不为空),则该字段不复制;也就是B中该字段没值时,才进行复制,适合于对B进行补充值的情况。
需求2:如果A中某字段没值(为空),则该字段不复制,也就是不要把空复制到B当中。
对于需求1,可以这样:
导入org。阿帕奇。公地。豆制品。bean utils bean
导入org。阿帕奇。公地。豆制品。财产用途;
公共类CopyWhenNullBeanUtilsBean扩展BeanUtilsBean{
@覆盖
public void copyProperty(对象豆子,字符串名称,对象值)
引发IllegalAccessException,InvocationTargetException {
尝试{
object destValue=property utils。getsimpleproperty(bean,name);
if (destValue==null) {
super.copyProperty(bean,name,value);
}
} catch(NoSuchMethodException e){
抛出新的运行时异常(e);
}
}
}
对于需求2,可以这样:
导入org。阿帕奇。公地。豆制品。bean utils bean
公共类CopyFromNotNullBeanUtilsBean扩展了BeanUtilsBean {
@覆盖
public void copyProperty(对象豆子,字符串名称,对象值)引发IllegalAccessException,InvocationTargetException {
if (value==null) {
返回;
}
super.copyProperty(bean,name,value);
}
}
关于Java beans.copyproperties()的详细用法,本文到此为止。有关Java beans.copyproperties的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。