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

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

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

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

# 前言

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

# 對象拷貝

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

# 什么是淺拷貝和深拷貝

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

而淺拷貝和深拷貝就是在這個基礎(chǔ)上做的區(qū)分,如果在拷貝這個對象的時候,只對基本數(shù)據(jù)類型進行了拷貝,而對引用數(shù)據(jù)類型只是進行引用的傳遞,而沒有真實的創(chuàng)建一個新的對象,則認為是淺拷貝。反之,在對引用數(shù)據(jù)類型進行拷貝的時候,創(chuàng)建了一個新的對象,并且復(fù)制其內(nèi)的成員變量,則認為是深拷貝。

簡單來說:

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

深拷貝:對基本數(shù)據(jù)類型進行值傳遞,對引用數(shù)據(jù)類型,創(chuàng)建一個新的對象,并復(fù)制其內(nèi)容,此為深拷貝。

淺析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開發(fā)規(guī)約插件上也明確指出:

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

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

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方法進行拷貝,只不過它的實現(xiàn)方式非常簡單,就是對兩個對象中相同名字的屬性進行簡單的get/set,僅檢查屬性的可訪問性。具體實現(xiàn)如下:

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的以及在源對象中不存在,所以這個方法是安全的,不會因為兩個對象之間的結(jié)構(gòu)差異導(dǎo)致錯誤,但是必須保證同名的兩個成員變量類型相同

# 小結(jié)

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

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

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品亚洲a∨一区二区三区18| 奇米狠狠一区二区三区| 国产精品中文字幕亚洲欧美| 亚洲免费一区三区| 一区二区三区国产在线| 麻豆成人在线| 免费人成精品欧美精品 | 国产精品红桃| 国产精品一级| 麻豆视频一区二区| 精品在线网站观看| 黄色在线观看www| 久久激情一区| 亚洲国产日韩欧美在线| 999在线观看精品免费不卡网站| 欧美特黄一区| 国产精品一区二区三区四区在线观看| 国产精品资源| 麻豆一区在线| 国产一区二区三区视频在线| 国产白浆在线免费观看| 精品亚洲美女网站| 日韩一区二区在线免费| 亚洲91久久| 99视频一区| 日本中文字幕一区二区| 久久福利在线| 毛片在线网站| 日韩亚洲精品在线| 午夜精品福利影院| 国产日产一区| 天堂√中文最新版在线| 激情欧美一区二区三区| 免费视频最近日韩| 日本视频一区二区| 高清一区二区| 今天的高清视频免费播放成人| 亚洲高清影视| 亚洲va久久久噜噜噜久久| 国产精品亚洲片在线播放| 国产中文字幕一区二区三区| 亚洲第一精品影视| 亚洲一级大片| 麻豆一区二区三区| 精品一区三区| 亚久久调教视频| 国产不卡av一区二区| 电影天堂国产精品| 男人的天堂亚洲一区| 国产精选久久| 国产中文在线播放| 伊人久久婷婷| 97久久亚洲| 日韩中文首页| 日韩精品欧美成人高清一区二区| 精品三区视频| 欧美精品九九| 国产精品高清一区二区| 亚洲夜间福利| 日韩成人精品一区二区三区| 国产一区二区三区久久久久久久久| 精品一区欧美| 国产精品videossex| 一区福利视频| 欧美激情日韩| 中文欧美日韩| 欧美激情日韩| 夜夜嗨网站十八久久| 国产私拍福利精品视频二区| 久久久精品五月天| 国产日韩欧美一区在线| 99久久婷婷| 国产欧美日韩视频在线| 一区二区三区四区在线看| 久久国产精品色av免费看| 今天的高清视频免费播放成人| 久久黄色影视| 夜夜嗨av一区二区三区网站四季av| 久久97视频| 麻豆精品91| 久久男人天堂| 国产精品一区二区三区av| 欧美日韩黑人| 精品视频一区二区三区在线观看 | 伊伊综合在线| 69堂精品视频在线播放| 国产91久久精品一区二区| 国产美女精品视频免费播放软件| 91精品成人| 综合日韩av| 日韩不卡在线观看日韩不卡视频 | 激情久久五月| 精品视频亚洲| 日本视频在线一区| 亚洲免费影院| 久久毛片亚洲| 国产精品115| 亚洲ww精品| 午夜在线视频观看日韩17c| 四虎884aa成人精品最新| 欧美激情麻豆| 石原莉奈在线亚洲三区| 久久久久久久久久久妇女| 麻豆国产一区| 欧美永久精品| 亚洲精品无吗| 蜜桃久久久久久| 婷婷色综合网| 精品一区亚洲| 久久高清免费| 99精品视频在线| 成人羞羞在线观看网站| 色欧美自拍视频| 国产一区二区三区天码| 久久av导航| 久久久国产精品网站| 欧美一区二区三区久久精品| 蜜桃久久久久久久| 亚洲一区黄色| 欧美在线综合| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲视频国产精品| 欧美日韩激情| 亚洲18在线| 国产精品成人自拍| 神马午夜在线视频| 亚洲精品一区二区妖精| 免费成人性网站| 国产欧美日韩在线观看视频 | 综合日韩av| 日韩中文视频| 亚洲少妇在线| 欧美日韩一区二区三区在线电影| 美腿丝袜亚洲三区| 亚洲精品.com| 免费成人在线观看| 国产精品色在线网站| 日韩网站中文字幕| 久久亚洲风情| 国产精品密蕾丝视频下载| 女生影院久久| 日韩中文字幕av电影| 欧美有码在线| 香蕉成人av| 亚洲午夜免费| 欧美成a人片免费观看久久五月天| 久久久精品五月天| 亚洲一区导航| 精品久久福利| 亚洲主播在线| se01亚洲视频| 国产精品国产三级在线观看| 丁香婷婷久久| 国产一区日韩欧美| 蜜桃视频免费观看一区| 欧美日本三区| 国产一区二区三区亚洲综合| 日韩精品1区| 久久av一区| 国产精品日韩精品在线播放| 国产精品网址| 日韩国产一区二区| 香蕉成人久久| 久久av超碰| 99精品综合| 日韩精品一区二区三区免费视频| 国产劲爆久久| 久久一级电影| 午夜亚洲福利| 精品视频在线观看网站| 欧美丝袜一区| 日韩精品社区| 日本高清不卡一区二区三区视频 | 欧美~级网站不卡| 在线综合亚洲| 欧美日韩xxxx| 最新中文字幕在线播放| 亚洲一区国产| 国产精品久久久久av蜜臀| 日韩三区在线| 日本欧美一区二区在线观看| 久久三级视频| 国产精品网址| 中文字幕日韩高清在线| 日韩在线观看一区| 欧美一区网站| 男女精品网站| 另类中文字幕国产精品| 国产精品午夜一区二区三区| 欧美大黑bbbbbbbbb在线| 久久不见久久见国语| 亚洲一区二区三区无吗| 亚洲a一区二区三区| 精品99久久| 国产亚洲电影| 免费看日韩精品| 欧美日韩精品一区二区视频| 精品三区视频| 国产亚洲欧美日韩精品一区二区三区| 亚洲欧美日韩一区在线观看|