,,java Beanutils.copyProperties( )用法详解

,,java Beanutils.copyProperties( )用法详解

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: