日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java Beanutils.copyProperties( )用法詳解

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

這是一篇開發自辯甩鍋稿~~~~

昨天測試小姐姐將我的一個bug單重開了,emmmm....內心OS:就調整下對象某個屬性類型這么簡單的操作,我怎么可能會出錯呢,一定不是我的鍋!!but再怎么抗拒,bug還是要改的,畢竟晚上就要發版本了~~

老老實實將我前天改的部分跟了一遍,恩,完美,沒有任何的缺失~~but本應success的測試數據,接口返還的結果確實是false來著,那還是老老實實debug吧。

一步步跟下來,恩,多么順暢,就說一定不是我的鍋~~誒?不對不對,這里的ID值,為啥是null?傳過來有值的呀!!發現原來是別人在修復bug時用了Beanutils.copyProperties( obj1,obj2),but 因為obj1中屬性名稱id,obj2中屬性名稱afterId,因為Beanutils.copyProperties( )要求處理的兩個對象的屬性名稱相同時才可以正常賦值,那好吧,我們今天就好好講講關于Beanutils.copyProperties( )吧~

1、簡介

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

2、用法

如果有兩個具有很多相同屬性的JavaBean,一個很常見的情況就是Struts里的PO對象(持久對象)和對應的ActionForm。例如:一個用戶注冊頁面,有一個User實體類和一個UserActionForm實體類,我們一般會在Action里從ActionForm構造一個PO對象,傳統的方式是使用類似下面的語句對屬性逐個賦值:

// 獲取 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到數據庫 ...

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

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

// 獲取 ActionForm 表單數據 UserActionForm uForm = (UserActionForm) form; // 構造一個User對象 User user = new User(); // 賦值 BeanUtils.copyProperties(user, uForm); // 然后調用JDBC、或操作Hibernate 持久化對象User到數據庫 .......

注:如果User和UserActionForm 間存在名稱不相同的屬性,則BeanUtils不對這些屬性進行處理,需要手動處理。例如:User類里面有個createDate 創建時間字段,而UserActionForm里面無此字段。BeanUtils.copyProperties()不會對此字段做任何處理。必須要自己手動處理。用法總結如下:

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

用法其實很簡單,第一個參數是要轉換的類,第二個參數是轉換后的類。

BeanUtils.copyProperties VS PropertyUtils.copyProperties

兩者最大的區別是:

BeanUtils.copyProperties會進行類型轉換,而PropertyUtils.copyProperties不會。既然進行了類型轉換,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProperties。

因此,PropertyUtils.copyProperties應用的范圍稍為窄一點,它只對名字和類型都一樣的屬性進行copy,如果名字一樣但類型不一樣,它會報錯。

使用BeanUtils有幾個要注意的地方:

1.對于類型為Boolean/Short/Integer/Float/Double的屬性,它會轉換為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上有人解釋說是因為這幾個類型都有對應的基本類型,在進行類型轉換時,有可能遇到類似Integer -> int的轉換,此時顯然不能對int類型的屬性賦值為null,因此統一轉換為0。

如何讓它不要轉為0呢?可以這樣:

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

2.對于java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time這幾個類,如果值為null,則在copy時會拋異常,需要使用對應的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(); //如果沒有下面幾行,則在轉換null時會拋異常,例如:org.apache.commons.beanutils.ConversionException: No value specified for ’BigDecimal’ //在org.apache.commons.beanutils.converters這個包下面有很多的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還會經常碰到這樣變態的需求:

假設是從A復制到B:需求1:如果B中某字段有值(不為null),則該字段不復制;也就是B中該字段沒值時,才進行復制,適合于對B進行補充值的情況。需求2:如果A中某字段沒值(為null),則該字段不復制,也就是不要把null復制到B當中。

對于需求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); } } }

對于需求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); } }

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚洲精品伦理| 亚洲国产一区二区在线观看 | 青青草精品视频| 久久亚洲国产精品一区二区| 激情综合在线| 欧美理论视频| 视频一区二区欧美| 日韩黄色免费网站| 一区二区国产在线| 免费久久精品视频| 国产亚洲电影| 欧美国产另类| 精品国产午夜肉伦伦影院| 精品香蕉视频| 日韩大片在线播放| 国产在线欧美| 日韩精品亚洲一区二区三区免费| 日韩免费精品| 精品视频一区二区三区在线观看| 手机在线电影一区| 亚洲午夜黄色| 日本aⅴ免费视频一区二区三区| 美女视频一区在线观看| 丰满少妇一区| 国产精品日本欧美一区二区三区| 久久国产99| 国内一区二区三区| 国产视频久久| 免费在线成人| 图片区亚洲欧美小说区| 国产无遮挡裸体免费久久| av一区在线| 亚洲美女91| 午夜av成人| 久久国产麻豆精品| 婷婷综合激情| 福利精品在线| 亚洲人成亚洲精品| 国产 日韩 欧美 综合 一区| 亚洲欧美日韩国产综合精品二区 | 国产一区二区精品久| 亚洲资源网站| 久久精品成人| 欧美极品中文字幕| 中文字幕亚洲在线观看| 日韩av有码| 久久精品资源| 日韩av在线播放中文字幕| 欧美另类综合| 欧美日韩在线二区| 精品资源在线| 国产精品亚洲欧美一级在线| 少妇久久久久| 欧美日韩免费看片| 精品三级av| 国产精品久久久久久久久久齐齐| 日韩中文字幕区一区有砖一区| 日韩一区欧美| 日韩精品麻豆| 亚洲深夜视频| 狠狠爱成人网| 久久av一区| 免费国产自线拍一欧美视频| 樱桃成人精品视频在线播放| 久久精选视频| 激情综合网站| 欧美a级片一区| 日韩1区2区| 日韩在线不卡| 亚洲精品一二三区区别| 一区在线免费观看| 日韩一级网站| 天堂精品久久久久| 青草国产精品| 久久亚洲人体| 精品亚洲美女网站| 中文日韩欧美| 日韩精品国产欧美| 久久精品日韩欧美| 狠狠久久伊人中文字幕| 国产一级成人av| 美女视频黄 久久| 日韩精品视频网| 亚洲开心激情| 五月激激激综合网色播| 久久免费视频66| 久久久久午夜电影| 模特精品在线| 国产亚洲欧美日韩精品一区二区三区 | 欧美成人日韩| 亚洲影院天堂中文av色| 日韩欧乱色一区二区三区在线| 精品在线网站观看| 亚洲激情中文在线| 国产精品15p| 欧美在线网站| 成人日韩av| 蜜桃免费网站一区二区三区| 91成人精品观看| 视频福利一区| 国产精品免费大片| 国产午夜久久| 国产成人精品一区二区三区免费 | 精品国产免费人成网站| 亚洲精品国产精品粉嫩| 国产精品久久观看| 国产综合色区在线观看| 日韩中文影院| 日韩亚洲精品在线| 四虎国产精品免费观看| 免播放器亚洲| 欧美性感美女一区二区 | 国产亚洲久久| 美女日韩在线中文字幕| 99久久婷婷| 免费亚洲一区| 国产日韩在线观看视频| 99国产精品久久久久久久| 日韩国产一区| 日韩一区精品| 天堂久久一区| 久久福利毛片| 99久久九九| av在线最新| 国产精品对白久久久久粗| 九色精品91| 黄色在线网站噜噜噜| 日本 国产 欧美色综合| 欧美日中文字幕| 欧美精品91| 日韩精品一卡二卡三卡四卡无卡| 在线日韩av| 一本一道久久a久久精品蜜桃| 亚洲成人精品| 久久字幕精品一区| 国产一区二区三区四区五区传媒| 美女久久久久久| 黑森林国产精品av| 都市激情国产精品| 日本精品影院| 午夜日韩在线| 日韩中文字幕无砖| 欧美日韩一区二区三区四区在线观看| 国产情侣久久| 超碰超碰人人人人精品| 樱桃成人精品视频在线播放| 亚洲视频二区| 激情不卡一区二区三区视频在线| 日本美女一区| 亚洲无线一线二线三线区别av| 亚洲少妇诱惑| 麻豆高清免费国产一区| 欧洲毛片在线视频免费观看| 亚洲三级网址| 久久影视三级福利片| 国产91欧美| 国产精品久久久久久模特| 综合视频一区| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品高潮| 亚洲午夜久久久久久尤物| 日本在线成人| 激情久久久久久| 精品中文在线| 精品丝袜在线| 国产欧美另类| 99国产精品| av亚洲一区二区三区| 一区二区精品| 日韩高清中文字幕一区二区| 国产精品国码视频| 日韩精品一区第一页| 日韩中文影院| 粉嫩av一区二区三区四区五区| 日本不卡高清| av一区二区高清| 你懂的亚洲视频| 日韩黄色av| 夜夜嗨av一区二区三区网站四季av| 中文久久精品| 成人av动漫在线观看| 国产一区二区亚洲| 国产精品亚洲四区在线观看 | 亚洲一区二区毛片| 91视频精品| 国产美女亚洲精品7777| 一二三区精品| 欧美另类综合| 日韩精品欧美激情一区二区| 亚洲精品亚洲人成在线观看| 久久精品导航| 欧美激情另类| 美女视频黄 久久| 国产精品第十页| 国产精品久久| 欧美在线不卡| 欧美日韩一区二区三区四区在线观看| 最新国产精品视频| 天海翼亚洲一区二区三区| 蜜臀av一区二区三区|