成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

淺析Java中Apache BeanUtils和Spring BeanUtils的用法

瀏覽:3日期:2023-08-02 15:14:11

# 前言

在我們實際項目開發過程中,我們經常需要將不同的兩個對象實例進行屬性復制,從而基于源對象的屬性信息進行后續操作,而不改變源對象的屬性信息,比如DTO數據傳輸對象和數據對象DO,我們需要將DO對象進行屬性復制到DTO,但是對象格式又不一樣,所以我們需要編寫映射代碼將對象中的屬性值從一種類型轉換成另一種類型。

# 對象拷貝

在具體介紹兩種 BeanUtils 之前,先來補充一些基礎知識。它們兩種工具本質上就是對象拷貝工具,而對象拷貝又分為深拷貝和淺拷貝,下面進行詳細解釋。

# 什么是淺拷貝和深拷貝

在Java中,除了 基本數據類型之外,還存在 類的實例對象這個引用數據類型,而一般使用 “=”號做賦值操作的時候,對于基本數據類型,實際上是拷貝的它的值,但是對于對象而言,其實賦值的只是這個對象的引用,將原對象的引用傳遞過去,他們實際還是指向的同一個對象。

而淺拷貝和深拷貝就是在這個基礎上做的區分,如果在拷貝這個對象的時候,只對基本數據類型進行了拷貝,而對引用數據類型只是進行引用的傳遞,而沒有真實的創建一個新的對象,則認為是淺拷貝。反之,在對引用數據類型進行拷貝的時候,創建了一個新的對象,并且復制其內的成員變量,則認為是深拷貝。

簡單來說:

淺拷貝:對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞般的拷貝,此為淺拷貝

深拷貝:對基本數據類型進行值傳遞,對引用數據類型,創建一個新的對象,并復制其內容,此為深拷貝。

淺析Java中Apache BeanUtils和Spring BeanUtils的用法

# BeanUtils

前面簡單講了一下對象拷貝的一些知識,下面就來具體看下兩種 BeanUtils 工具

# Apache 的 BeanUtils

首先來看一個非常簡單的BeanUtils的例子

publicclass PersonSource { private Integer id; private String username; private String password; private Integer age; // getters/setters omiited}publicclass PersonDest { private Integer id; private String username; private Integer age; // getters/setters omiited}publicclass TestApacheBeanUtils { public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { //下面只是用于單獨測試 PersonSource personSource = new PersonSource(1, 'pjmike', '12345', 21); PersonDest personDest = new PersonDest(); BeanUtils.copyProperties(personDest,personSource); System.out.println('persondest: '+personDest); }}persondest: PersonDest{id=1, username=’pjmike’, age=21}

從上面的例子可以看出,對象拷貝非常簡單,BeanUtils最常用的方法就是:

//將源對象中的值拷貝到目標對象//將源對象中的值拷貝到目標對象public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException { BeanUtilsBean.getInstance().copyProperties(dest, orig);}

但是由于 Apache下的BeanUtils對象拷貝性能太差,不建議使用,而且在阿里巴巴Java開發規約插件上也明確指出:

Ali-Check | 避免用Apache Beanutils進行屬性的copy。

commons-beantutils 對于對象拷貝加了很多的檢驗,包括類型的轉換,甚至還會檢驗對象所屬的類的可訪問性,可謂相當復雜,這也造就了它的差勁的性能,具體實現代碼如下:

public void copyProperties(final Object dest, final Object orig) throws IllegalAccessException, InvocationTargetException { // Validate existence of the specified beans if (dest == null) { thrownew IllegalArgumentException ('No destination bean specified'); } if (orig == null) { thrownew IllegalArgumentException('No origin bean specified'); } if (log.isDebugEnabled()) { log.debug('BeanUtils.copyProperties(' + dest + ', ' + orig + ')'); } // Copy the properties, converting as necessary if (orig instanceof DynaBean) { final DynaProperty[] origDescriptors = ((DynaBean) orig).getDynaClass().getDynaProperties(); for (DynaProperty origDescriptor : origDescriptors) { final String name = origDescriptor.getName(); // Need to check isReadable() for WrapDynaBean // (see Jira issue# BEANUTILS-61) if (getPropertyUtils().isReadable(orig, name) && getPropertyUtils().isWriteable(dest, name)) { final Object value = ((DynaBean) orig).get(name); copyProperty(dest, name, value); } } } elseif (orig instanceof Map) { @SuppressWarnings('unchecked') final // Map properties are always of type <String, Object> Map<String, Object> propMap = (Map<String, Object>) orig; for (final Map.Entry<String, Object> entry : propMap.entrySet()) { final String name = entry.getKey(); if (getPropertyUtils().isWriteable(dest, name)) { copyProperty(dest, name, entry.getValue()); } } } else/* if (orig is a standard JavaBean) */ { final PropertyDescriptor[] origDescriptors = getPropertyUtils().getPropertyDescriptors(orig); for (PropertyDescriptor origDescriptor : origDescriptors) { final String name = origDescriptor.getName(); if ('class'.equals(name)) { continue; // No point in trying to set an object’s class } if (getPropertyUtils().isReadable(orig, name) && getPropertyUtils().isWriteable(dest, name)) { try { final Object value = getPropertyUtils().getSimpleProperty(orig, name); copyProperty(dest, name, value); } catch (final NoSuchMethodException e) { // Should not happen } } } } }

# Spring 的 BeanUtils

使用spring的BeanUtils進行對象拷貝:

publicclass TestSpringBeanUtils { public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { //下面只是用于單獨測試 PersonSource personSource = new PersonSource(1, 'pjmike', '12345', 21); PersonDest personDest = new PersonDest(); BeanUtils.copyProperties(personSource,personDest); System.out.println('persondest: '+personDest); }}

Spring下的BeanUtils也是使用 copyProperties方法進行拷貝,只不過它的實現方式非常簡單,就是對兩個對象中相同名字的屬性進行簡單的get/set,僅檢查屬性的可訪問性。具體實現如下:

private static void copyProperties(Object source, Object target, @Nullable Class<?> editable, @Nullable String... ignoreProperties) throws BeansException { Assert.notNull(source, 'Source must not be null'); Assert.notNull(target, 'Target must not be null'); Class<?> actualEditable = target.getClass(); if (editable != null) { if (!editable.isInstance(target)) { throw new IllegalArgumentException('Target class [' + target.getClass().getName() + '] not assignable to Editable class [' + editable.getName() + ']'); } actualEditable = editable; } PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable); List<String> ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null); for (PropertyDescriptor targetPd : targetPds) { Method writeMethod = targetPd.getWriteMethod(); if (writeMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) { PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName()); if (sourcePd != null) { Method readMethod = sourcePd.getReadMethod(); if (readMethod != null && ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) { try { if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) { readMethod.setAccessible(true); } Object value = readMethod.invoke(source); if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) { writeMethod.setAccessible(true); } writeMethod.invoke(target, value); } catch (Throwable ex) { throw new FatalBeanException( 'Could not copy property ’' + targetPd.getName() + '’ from source to target', ex); } } } } } }

可以看到,成員變量賦值是基于目標對象的成員列表,并且會跳過ignore的以及在源對象中不存在,所以這個方法是安全的,不會因為兩個對象之間的結構差異導致錯誤,但是必須保證同名的兩個成員變量類型相同

# 小結

以上簡要的分析兩種BeanUtils,因為Apache下的BeanUtils性能較差,不建議使用,可以使用 Spring的BeanUtils ,或者使用其他拷貝框架,比如:Dozer、ModelMapper等等

到此這篇關于淺析Java中Apache BeanUtils和Spring BeanUtils的用法的文章就介紹到這了,更多相關Apache BeanUtils和Spring BeanUtils內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日本aⅴ亚洲精品中文乱码| 精品一区二区三区视频| 亚洲国产综合在线看不卡| 日韩一区二区电影在线| 欧美日韩亚洲在线| 亚洲一区三区在线观看| 香蕉加勒比综合久久| 在线国产亚洲欧美| 国产一区免费视频| 国产盗摄视频一区二区三区| 有坂深雪av一区二区精品| 日韩欧美国产高清| 久久精品女人的天堂av| 久久成人麻豆午夜电影| 亚洲视频 欧洲视频| 日韩午夜av电影| 97成人超碰视| 欧美美女网站色| 6080yy午夜一二三区久久| 国产亚洲自拍一区| 最新欧美精品一区二区三区| 亚洲欧美一区二区三区孕妇| 91福利资源站| 欧美高清视频在线高清观看mv色露露十八| 欧美日韩国产不卡| 欧美日本高清视频在线观看| 日韩精品一区二区三区老鸭窝| 26uuu另类欧美| 日本一区二区三区dvd视频在线 | 日韩高清在线不卡| 捆绑调教一区二区三区| 婷婷激情综合网| 国产剧情一区在线| 99久久综合国产精品| 成人国产精品免费观看| 欧美三级第一页| 在线一区视频| 欧美午夜影院一区| 精品国产一区二区三区av性色| 久久久亚洲精品石原莉奈| 亚洲色图第一区| 日韩福利电影在线观看| 国产成人综合亚洲网站| 欧美日韩一区在线播放| 欧美中文字幕| 日韩一区二区三区视频| 国产欧美在线观看一区| 亚洲欧美区自拍先锋| 日韩不卡免费视频| 久久 天天综合| av在线综合网| 亚洲一区视频| 26uuu另类欧美亚洲曰本| 亚洲精品成人天堂一二三| 蜜臀av国产精品久久久久| 成人不卡免费av| 国产精品亚洲一区| 欧美一区二区三区的| 中文字幕在线视频一区| 日本不卡的三区四区五区| 99久久精品免费精品国产| 一区二区精品在线| 884aa四虎影成人精品一区| 久久一区二区三区av| 国产欧美日韩精品在线| 麻豆91精品视频| 欧美高清视频在线高清观看mv色露露十八 | 欧美在线播放高清精品| 国产一区二区91| 欧美一区二区三区小说| 色综合天天天天做夜夜夜夜做| 中文字幕中文字幕一区| 欧美日韩三区| 国内精品久久久久影院薰衣草| 国产精品日韩一区二区| 国内精品久久久久影院薰衣草 | 免费在线亚洲欧美| 国产欧美一区二区精品性色超碰| 国色天香一区二区| 亚洲国产一区二区a毛片| 欧美日韩亚洲高清一区二区| 91丨九色丨黑人外教| 一区二区三区久久| 欧美日韩国产综合视频在线观看| 99久久综合精品| 亚洲美女视频在线| 欧美一区二区三区在线视频| 狠狠色丁香久久综合频道| 亚洲成人激情社区| 日韩欧美国产不卡| 国产精品一区免费观看| 国产一区二区主播在线| 亚洲人成在线播放网站岛国| 欧美一区二区三区四区久久| 欧美成人一品| 日韩精品乱码av一区二区| 久久天天做天天爱综合色| 美女黄色成人网| 成人开心网精品视频| 亚洲女人小视频在线观看| 欧美精品国产精品| 亚洲国产一区二区三区高清| 国产一区二区视频在线播放| 成人欧美一区二区三区小说| 欧美日韩亚州综合| 女人香蕉久久**毛片精品| 日韩中文欧美在线| 国产欧美日韩在线| 欧美性色欧美a在线播放| 狠狠久久综合婷婷不卡| 国产成人高清在线| 亚洲v精品v日韩v欧美v专区| 国产欧美日韩综合精品一区二区| 欧美视频在线一区| 在线亚洲激情| 亚洲欧美亚洲| 懂色av一区二区三区免费看| 午夜精品一区二区三区三上悠亚| 国产欧美综合色| 3751色影院一区二区三区| 美女诱惑黄网站一区| 欧美久久综合| 国产成人精品免费| 日韩成人一区二区| 国产精品精品国产色婷婷| 欧美一区二区三区在线观看 | 国产在线精品一区二区不卡了| 亚洲精选在线视频| 久久影院午夜论| 欧美性猛片aaaaaaa做受| 亚洲精品中文字幕在线| 97精品久久久久中文字幕| 男女男精品视频| 一区二区在线观看不卡| 久久精品亚洲乱码伦伦中文 | 欧美三区免费完整视频在线观看| 亚洲精品护士| 免费在线观看一区二区三区| 亚洲精品视频免费看| 国产校园另类小说区| 日韩欧美国产1| 51久久夜色精品国产麻豆| 久久一区二区三区av| 9国产精品视频| 午夜精品婷婷| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 精品奇米国产一区二区三区| 欧美日韩一区二区三区视频| 中文亚洲免费| 欧美不卡福利| 成人免费视频国产在线观看| 欧美激情综合| 欧美年轻男男videosbes| 欧美大片拔萝卜| 久久久噜噜噜久久人人看| 国产精品人妖ts系列视频| 亚洲在线视频网站| 欧美日韩一区自拍| 欧美日韩一区三区四区| 中文字幕制服丝袜一区二区三区| 国产福利视频一区二区三区| 国产精品视频看| 久久久久高清精品| 欧美日本一区二区在线观看| 色噜噜久久综合| 色哟哟在线观看一区二区三区| 亚洲一区三区视频在线观看| 国产亚洲第一区| 国产精品久久久久久久久久直播| 国产综合18久久久久久| 欧美/亚洲一区| 色综合亚洲欧洲| 99re在线精品| 成人av在线一区二区| 粗大黑人巨茎大战欧美成人| 高清免费成人av| 丁香桃色午夜亚洲一区二区三区| 国产精品正在播放| 国产美女久久久久| 国产一区二区三区国产| 国产一区二区三区最好精华液| 国产在线精品一区二区夜色| 另类专区欧美蜜桃臀第一页| 老司机免费视频一区二区| 久久精品国产秦先生| 韩国理伦片一区二区三区在线播放| 九九久久精品视频| 狠狠久久亚洲欧美| 国产精品一区二区在线观看不卡| 国产剧情一区二区| 国产成人av资源| 不卡在线视频中文字幕| 欧美aⅴ99久久黑人专区| 欧美精品麻豆| 久久国产精品第一页| 欧美一区二区三区在线观看视频| 欧美日韩精品伦理作品在线免费观看| 精品视频在线免费看| 黑人精品欧美一区二区蜜桃| 欧美色网一区二区|