久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java Beanutils.copyProperties( )用法詳解

瀏覽:4日期:2022-09-01 16:48:57

這是一篇開(kāi)發(fā)自辯甩鍋稿~~~~

昨天測(cè)試小姐姐將我的一個(gè)bug單重開(kāi)了,emmmm....內(nèi)心OS:就調(diào)整下對(duì)象某個(gè)屬性類型這么簡(jiǎn)單的操作,我怎么可能會(huì)出錯(cuò)呢,一定不是我的鍋!!but再怎么抗拒,bug還是要改的,畢竟晚上就要發(fā)版本了~~

老老實(shí)實(shí)將我前天改的部分跟了一遍,恩,完美,沒(méi)有任何的缺失~~but本應(yīng)success的測(cè)試數(shù)據(jù),接口返還的結(jié)果確實(shí)是false來(lái)著,那還是老老實(shí)實(shí)debug吧。

一步步跟下來(lái),恩,多么順暢,就說(shuō)一定不是我的鍋~~誒?不對(duì)不對(duì),這里的ID值,為啥是null?傳過(guò)來(lái)有值的呀!!發(fā)現(xiàn)原來(lái)是別人在修復(fù)bug時(shí)用了Beanutils.copyProperties( obj1,obj2),but 因?yàn)閛bj1中屬性名稱id,obj2中屬性名稱afterId,因?yàn)锽eanutils.copyProperties( )要求處理的兩個(gè)對(duì)象的屬性名稱相同時(shí)才可以正常賦值,那好吧,我們今天就好好講講關(guān)于Beanutils.copyProperties( )吧~

1、簡(jiǎn)介

BeanUtils提供對(duì)Java反射和自省API的包裝。其主要目的是利用反射機(jī)制對(duì)JavaBean的屬性進(jìn)行處理。

2、用法

如果有兩個(gè)具有很多相同屬性的JavaBean,一個(gè)很常見(jiàn)的情況就是Struts里的PO對(duì)象(持久對(duì)象)和對(duì)應(yīng)的ActionForm。例如:一個(gè)用戶注冊(cè)頁(yè)面,有一個(gè)User實(shí)體類和一個(gè)UserActionForm實(shí)體類,我們一般會(huì)在Action里從ActionForm構(gòu)造一個(gè)PO對(duì)象,傳統(tǒng)的方式是使用類似下面的語(yǔ)句對(duì)屬性逐個(gè)賦值:

// 獲取 ActionForm 表單數(shù)據(jù) UserActionForm uForm = (UserActionForm) form; // 構(gòu)造一個(gè)User對(duì)象 User user = new User(); // 逐一賦值 user.setUsername(uForm.getUsername); user.setPassword(uForm.getPassword); user.setAge(uForm.getAge); ........... ........... // 然后調(diào)用JDBC、或操作Hibernate 持久化對(duì)象User到數(shù)據(jù)庫(kù) ...

通過(guò)這樣的方法如果表單屬性字段很多,達(dá)到了100、1000甚至更多,那我們不是要寫(xiě)100、1000行set、get了。誰(shuí)都不愿意這樣做。

而我們使用 BeanUtils.copyProperties() 方法以后,代碼量大大的減少,而且整體程序看著也簡(jiǎn)潔明朗,代碼如下:

// 獲取 ActionForm 表單數(shù)據(jù) UserActionForm uForm = (UserActionForm) form; // 構(gòu)造一個(gè)User對(duì)象 User user = new User(); // 賦值 BeanUtils.copyProperties(user, uForm); // 然后調(diào)用JDBC、或操作Hibernate 持久化對(duì)象User到數(shù)據(jù)庫(kù) .......

注:如果User和UserActionForm 間存在名稱不相同的屬性,則BeanUtils不對(duì)這些屬性進(jìn)行處理,需要手動(dòng)處理。例如:User類里面有個(gè)createDate 創(chuàng)建時(shí)間字段,而UserActionForm里面無(wú)此字段。BeanUtils.copyProperties()不會(huì)對(duì)此字段做任何處理。必須要自己手動(dòng)處理。用法總結(jié)如下:

[java] view plain copy print?BeanUtils.copyProperties('要轉(zhuǎn)換的類', '轉(zhuǎn)換后的類'); [java] view plain copy print?PropertyUtils.copyProperties('要轉(zhuǎn)換的類', '轉(zhuǎn)換后的類');

用法其實(shí)很簡(jiǎn)單,第一個(gè)參數(shù)是要轉(zhuǎn)換的類,第二個(gè)參數(shù)是轉(zhuǎn)換后的類。

BeanUtils.copyProperties VS PropertyUtils.copyProperties

兩者最大的區(qū)別是:

BeanUtils.copyProperties會(huì)進(jìn)行類型轉(zhuǎn)換,而PropertyUtils.copyProperties不會(huì)。既然進(jìn)行了類型轉(zhuǎn)換,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProperties。

因此,PropertyUtils.copyProperties應(yīng)用的范圍稍為窄一點(diǎn),它只對(duì)名字和類型都一樣的屬性進(jìn)行copy,如果名字一樣但類型不一樣,它會(huì)報(bào)錯(cuò)。

使用BeanUtils有幾個(gè)要注意的地方:

1.對(duì)于類型為Boolean/Short/Integer/Float/Double的屬性,它會(huì)轉(zhuǎn)換為0:

public class User { private Integer intVal; private Double doubleVal; private Short shortVal; private Long longVal; private Float floatVal; private Byte byteVal; private Boolean booleanVal; } User src = new User(); User dest = new User(); BeanUtils.copyProperties(dest, src); System.out.println(src); System.out.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上有人解釋說(shuō)是因?yàn)檫@幾個(gè)類型都有對(duì)應(yīng)的基本類型,在進(jìn)行類型轉(zhuǎn)換時(shí),有可能遇到類似Integer -> int的轉(zhuǎn)換,此時(shí)顯然不能對(duì)int類型的屬性賦值為null,因此統(tǒng)一轉(zhuǎn)換為0。

如何讓它不要轉(zhuǎn)為0呢?可以這樣:

import org.apache.commons.beanutils.converters.IntegerConverter; IntegerConverter converter = new IntegerConverter(null); //默認(rèn)為null,而不是0 BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); beanUtilsBean.getConvertUtils().register(converter, Integer.class);

2.對(duì)于java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time這幾個(gè)類,如果值為null,則在copy時(shí)會(huì)拋異常,需要使用對(duì)應(yīng)的Conveter:

public class User2 { private java.util.Date javaUtilDateVal; private java.sql.Date javaSqlDateVal; private java.sql.Timestamp javaSqlTimeStampVal; private BigDecimal bigDecimalVal; private java.sql.Time javaSqlTime; } User2 src = new User2(); User2 dest = new User2(); BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); //如果沒(méi)有下面幾行,則在轉(zhuǎn)換null時(shí)會(huì)拋異常,例如:org.apache.commons.beanutils.ConversionException: No value specified for ’BigDecimal’ //在org.apache.commons.beanutils.converters這個(gè)包下面有很多的Converter,可以按需要使用 beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.BigDecimalConverter(null), BigDecimal.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.DateConverter(null), java.util.Date.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class); beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimeConverter(null), java.sql.Time.class); beanUtilsBean.copyProperties(dest, src); System.out.println(src); System.out.println(dest);

使用BeanUtils還會(huì)經(jīng)常碰到這樣變態(tài)的需求:

假設(shè)是從A復(fù)制到B:需求1:如果B中某字段有值(不為null),則該字段不復(fù)制;也就是B中該字段沒(méi)值時(shí),才進(jìn)行復(fù)制,適合于對(duì)B進(jìn)行補(bǔ)充值的情況。需求2:如果A中某字段沒(méi)值(為null),則該字段不復(fù)制,也就是不要把null復(fù)制到B當(dāng)中。

對(duì)于需求1,可以這樣:

import org.apache.commons.beanutils.BeanUtilsBean; import org.apache.commons.beanutils.PropertyUtils; public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{ @Override public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException { try { Object destValue = PropertyUtils.getSimpleProperty(bean, name); if (destValue == null) { super.copyProperty(bean, name, value); } } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } }

對(duì)于需求2,可以這樣:

import org.apache.commons.beanutils.BeanUtilsBean; public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean { @Override public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException { if (value == null) { return; } super.copyProperty(bean, name, value); } }

到此這篇關(guān)于java Beanutils.copyProperties( )用法詳解的文章就介紹到這了,更多相關(guān)java Beanutils.copyProperties 內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产特级毛片 | 精品无码久久久久国产 | 欧美日本免费 | 黄色片在线免费观看 | 国产一级一级国产 | 免费高清av | 亚洲精品一区二区网址 | 国产综合久久久 | 亚洲高清一区二区三区 | 亚洲成人精品久久久 | 精品国产一区二区三区不卡蜜臂 | 国产香蕉视频在线播放 | 国产午夜精品一区二区三区 | 日韩无 | 国产美女久久 | 999视频在线免费观看 | 亚洲一区二区三区在线播放 | 成人免费一区二区三区视频网站 | 亚洲一区二区三区在线视频 | 99精品欧美一区二区三区 | 精品人人 | 成人日韩av | 国产综合精品一区二区三区 | 偷拍自拍亚洲欧美 | 亚洲男人天堂网 | 91麻豆精品国产91久久久久久久久 | 精品久久网 | 精品无码久久久久久国产 | 国产一区 | 国产欧美精品一区二区 | 欧美日韩免费在线 | 国产高清一二三区 | 五月婷婷婷婷 | 91精品国产综合久久精品 | 大桥未久亚洲精品久久久强制中出 | 视频在线一区二区三区 | 欧美自拍网站 | 亚洲免费视频一区二区 | a免费在线观看 | 99热在线观看免费 | 热久久久久 |