最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java Beanutils.copyProperties( )用法詳解

 更新時(shí)間:2020年05月14日 10:58:07   作者:籬笆的嫩  
這篇文章主要介紹了java Beanutils.copyProperties( )用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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

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

1、簡介

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

2、用法

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

// 獲取 ActionForm 表單數(shù)據(jù) 
 UserActionForm uForm = (UserActionForm) form; 

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

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

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

// 獲取 ActionForm 表單數(shù)據(jù) 
UserActionForm uForm = (UserActionForm) form; 

// 構(gòu)造一個(gè)User對象 
User user = new User(); 
 
// 賦值 
BeanUtils.copyProperties(user, uForm); 

// 然后調(diào)用JDBC、或操作Hibernate 持久化對象User到數(shù)據(jù)庫 
....... 

注:如果User和UserActionForm 間存在名稱不相同的屬性,則BeanUtils不對這些屬性進(jìn)行處理,需要手動(dòng)處理。例如:
User類里面有個(gè)createDate 創(chuàng)建時(shí)間字段,而UserActionForm里面無此字段。BeanUtils.copyProperties()不會(huì)對此字段做任何處理。必須要自己手動(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í)很簡單,第一個(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),它只對名字和類型都一樣的屬性進(jìn)行copy,如果名字一樣但類型不一樣,它會(huì)報(bào)錯(cuò)。

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

1.對于類型為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上有人解釋說是因?yàn)檫@幾個(gè)類型都有對應(yīng)的基本類型,在進(jìn)行類型轉(zhuǎn)換時(shí),有可能遇到類似Integer -> int的轉(zhuǎn)換,此時(shí)顯然不能對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.對于java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time這幾個(gè)類,如果值為null,則在copy時(shí)會(huì)拋異常,需要使用對應(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(); 
 
//如果沒有下面幾行,則在轉(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中該字段沒值時(shí),才進(jìn)行復(fù)制,適合于對B進(jìn)行補(bǔ)充值的情況。
需求2:如果A中某字段沒值(為null),則該字段不復(fù)制,也就是不要把null復(fù)制到B當(dāng)中。

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

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

相關(guān)文章

  • k8s+springboot+CronJob定時(shí)任務(wù)部署實(shí)現(xiàn)

    k8s+springboot+CronJob定時(shí)任務(wù)部署實(shí)現(xiàn)

    本文主要介紹了k8s+springboot+CronJob定時(shí)任務(wù)部署實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • spring MVC中接口參數(shù)解析的過程詳解

    spring MVC中接口參數(shù)解析的過程詳解

    這篇文章主要給大家介紹了關(guān)于spring MVC中接口參數(shù)解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring mvc具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Spring Boot + thymeleaf 實(shí)現(xiàn)文件上傳下載功能

    Spring Boot + thymeleaf 實(shí)現(xiàn)文件上傳下載功能

    最近同事問我有沒有有關(guān)于技術(shù)的電子書,我打開電腦上的小書庫,但是郵件發(fā)給他太大了,公司又禁止用文件夾共享,于是花半天時(shí)間寫了個(gè)小的文件上傳程序,部署在自己的Linux機(jī)器上,需要的朋友可以參考下
    2018-01-01
  • Java文件讀寫IO/NIO及性能比較詳細(xì)代碼及總結(jié)

    Java文件讀寫IO/NIO及性能比較詳細(xì)代碼及總結(jié)

    這篇文章主要介紹了Java文件讀寫IO/NIO及性能比較詳細(xì)代碼及總結(jié),具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java線程阻塞工具LockSupport用法詳解

    Java線程阻塞工具LockSupport用法詳解

    Java中的LockSupport是一個(gè)用于線程同步的工具類,它提供了一種基于線程的阻塞和喚醒機(jī)制,LockSupport可以讓線程在特定條件下阻塞掛起,等待其他線程發(fā)送信號來喚醒它,本文將通過一個(gè)小案例給大家介紹一下LockSupport怎么用,讓你永遠(yuǎn)記住它
    2023-08-08
  • java中的內(nèi)存溢出方式

    java中的內(nèi)存溢出方式

    文章介紹了如何使用jmap和IBMHeapAnalyzer等工具分析OutOfMemoryError: Compressedclassspace錯(cuò)誤,發(fā)現(xiàn)問題出在/org/pf4j/PluginClassLoader加載了大量類
    2024-12-12
  • netty中的IO、NIO、AIO使用詳解

    netty中的IO、NIO、AIO使用詳解

    這篇文章主要介紹了netty中的IO、NIO、AIO使用詳解,本文會(huì)說明各種IO的特點(diǎn)、分別解決了什么樣的問題做一個(gè)分析闡述,并結(jié)合Java代碼例子來輔助理解,像這些的歷史演進(jìn)和詳細(xì)的底層原理網(wǎng)上很多,所以我們只站在應(yīng)用層,使用者的角度去分析,需要的朋友可以參考下
    2023-12-12
  • SpringBoot使用Flyway進(jìn)行數(shù)據(jù)庫管理的操作方法

    SpringBoot使用Flyway進(jìn)行數(shù)據(jù)庫管理的操作方法

    Flyway是一個(gè)開源的數(shù)據(jù)庫版本管理工具,并且極力主張“約定大于配置”,簡單、專注、強(qiáng)大。接下來通過本文給大家介紹SpringBoot使用Flyway進(jìn)行數(shù)據(jù)庫管理的方法,感興趣的朋友一起看看吧
    2021-09-09
  • 解決restlet client報(bào)錯(cuò)No response.Is the certificate valid? Click here to check.

    解決restlet client報(bào)錯(cuò)No response.Is the cer

    這篇文章主要介紹了解決restlet client報(bào)錯(cuò)No response.Is the certificate valid? Click here to check.問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • IDEA強(qiáng)制清除Maven緩存的實(shí)現(xiàn)示例

    IDEA強(qiáng)制清除Maven緩存的實(shí)現(xiàn)示例

    清除項(xiàng)目緩存是一個(gè)常見的操作,本文主要介紹了IDEA強(qiáng)制清除Maven緩存的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07

最新評論

侯马市| 六安市| 无锡市| 南陵县| 龙州县| 高密市| 康平县| 博罗县| 高青县| 崇左市| SHOW| 舒城县| 广平县| 麟游县| 南召县| 永德县| 沈丘县| 余姚市| 顺义区| 莎车县| 遂昌县| 临沭县| 吐鲁番市| 康保县| 扶沟县| 浪卡子县| 常山县| 乌拉特中旗| 张家界市| 铅山县| 漳平市| 礼泉县| 巧家县| 东丽区| 龙泉市| 宜章县| 集安市| 平原县| 常德市| 沛县| 和硕县|