999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

SpringBeanUtils和ApacheBeanUtils屬性拷貝的對比和應用*

2023-01-30 04:08:20楊春發
計算機時代 2023年1期
關鍵詞:方法

楊春發,潘 鶴,李 鑫

(1.中國電建集團華東勘測設計研究院有限公司,浙江 杭州 311122;2.中電建華東勘測設計研究院(鄭州)有限公司)

0 引言

“灃西新城”為區域內建設項目,對于其數據平臺的建設,需要融入CIM(City Information Modeling)理念,即建立CIM 基礎數據平臺。該平臺服務于城市規劃、建設和治理等多個場景,為城市挖掘數據價值,有效避免重復投資與建設助力。

平臺開發中,需要將不同二維數據對象的相同或相似屬性進行賦值。傳統的方法是通過手動編寫Getter/Setter 為屬性或字段賦值,當拷貝對象字段較多時,會導致大量代碼堆積,可讀性降低。為解決這一痛點,平臺引入拷貝工具類,分別為Apache和Spring的BeanUtils,以優化兩個任意多字段對象的屬性拷貝,提高開發效率,為相似二維數據對象復制繁瑣問題,提供解決方案。

1 相關定義

1.1 BeanUtils

JavaBeans 的靜態便捷方法,對Bean 進行實例化、檢查屬性類型、復制屬性等操作。應用比較廣泛的一個是Apache Commons 的BeanUtils,另一個是Spring Framework的BeanUtils。

1.2 JavaBean

JavaBean 作為工具類的作用對象,本質上是一種命名規則,具體如下。

⑴對于一個名稱為xxx的屬性,通常要寫兩個方法:getXxx()和setXxx()。任何瀏覽這些方法的工具,都會把set 或get 后的第一個字母轉為小寫,以此產生屬性名。get方法返回的類型需要與set方法里的參數相同,屬性名稱與get和set所依據的類型毫無關系。

⑵對于布爾類型屬性,使用以上的get 和set 方式,可把get替換成is。

⑶ Bean 中的普通方法不必遵循以上的命名規則,不過其訪問權限控制符必須是public的[1]。

2 實現原理

2.1 深拷貝與淺拷貝

工具類本質上是對象的拷貝,而對象拷貝又分為深拷貝和淺拷貝,BeanUtils 的拷貝方法就是淺拷貝,拷貝原理見圖1,定義如下:

圖1 拷貝原理圖

⑴淺拷貝:對基本類型采用值傳遞(傳遞該變量的副本)。對引用類型進行引用傳遞即復制指向源對象的地址,不復制對象本身,修改新對象會影響原對象。

⑵深拷貝:對基本類型采用值傳遞,對引用類型來說,深拷貝會復制一個完全與源對象一樣的對象,且不共享內存。

2.2 反射與自省

工具類的核心拷貝原理就是通過反射和自省實現的。

Java反射機制是在運行中,對任意一個類,能夠獲取得到這個類的所有屬性和方法,對于任意一個對象,都能夠調用類的任意一個方法,這種動態獲取類信息以及動態調用類對象方法的功能叫做Java語言的反射機制[2]。利用反射機制編寫與執行程序代碼時,使程序代碼能夠接入裝載到JVM中的類的內部信息[3]。

內省是操作Java 對象屬性的API,內省依賴于反射,利用BeanInfo來獲取屬性描述器,就可獲取某個屬性對應的Getter和Setter方法,最后通過反射機制來調用Getter和Setter方法[4]。

2.3 小結

BeanUtils 本質是通過內省對JavaBean 的屬性進行淺拷貝,通過Class 引用獲取BeanInfo 信息,調用BeanInfo 的getPropertyDescriptors 方法,返回類型為PropertyDescriptor 的屬性描述器數組。針對每一個PropertyDescriptor,調用getPropertyType 方法得到類型,getName 方法得到屬性名,getReadMethod 方法得到讀方法,getWriteMethod 方法得到寫方法,后兩個方法返回Method 對象,在對象上調用相應方法(invoke),進行屬性的賦值。

3 實驗與結果分析

3.1 實驗場景

實驗以平臺的三維可視化系統返回單條場景及相關信息為例進行測試,使用Spring-Beans5.1.10 和Commons-BeanUtils1.9.3 作為實驗版本,持久層方法對源對象屬性賦值后,依次用兩個工具類對源、目標對象的同名屬性值進行拷貝,打印場景聯合體對象的編號、名字、相關第一條圖層編號、相關第一條標繪編號,核心調用方法如下:

3.2 結果分析及結論

3.2.1 鏈式編程的支持性

⑴實驗結果及分析

圖2 是工具類對啟用鏈式編程的對象拷貝后的打印結果,使用Spring 的BeanUtils 能正常打印新聞信息,而使用Apache 的BeanUtils 拷貝為空,具體原因如下。

圖2 啟用鏈式編程打印結果

①Apache 中,使用默認的getWriteMethod()方法,通過查找set前綴的屬性名方法并判斷返回類型是否為void類型,如下:

②而SpringBean 中在獲取BeanInfo 對象的過程中,提供候選方法,候選可寫方法將返回類型不是void的類型納入可寫方法中,而鏈式編程的返回類型是本類,這就導致Apache的BeanUtils不支持鏈式編程。

③關閉鏈式編程后再次測試,兩個工具類會打印同樣的結果,如圖3所示。

圖3 關閉鏈式編程打印結果

⑵結論

Spring 的BeanUtils 支持鏈式編程,而Apache 的BeanUtils不支持。

3.2.2 安全性

⑴實驗結果及分析

圖4、圖5 是Spring BeanUtils、Apache BeanUtils對于null的Long 寫入long 類型的打印結果,前者提示非法參數異常,后者拷貝正常,原因如下:

圖4 SpringBeanUtils打印結果

圖5 ApacheBeanUtils打印結果

①Spring的BeanUtils的部分代碼:

②Apache的BeanUtils的部分代碼:

Apache 的工具類采用多種數據驗證方式來保障安全性,包括類型的轉換,甚至還會檢驗對象所屬類的可訪問性。

⑵結論Spring的BeanUtils校驗更少,而Apache的BeanUtils會進行多種數據驗證和類型轉換,是更安全的。

3.2.3 性能

⑴實驗結果及分析

針對兩種拷貝工具類一次進行100,10000,100000,1000000 的對象數量多次拷貝,具體平均消耗時間如圖6所示。

圖6 BeanUtils性能對比圖

在大數量對象拷貝時,SpringBeanUtils 的拷貝性能是ApacheBeanUtils 的近十倍,其主要原因在于Apache BeanUtils 對屬性的各類條件判斷,包括但不限于類型、可讀性等。Apache BeanUtils 還對類加載器進行單例限制,獲取實例時會加鎖,造成資源持有,影響性能。

⑵結論

Spring 的BeanUtils 內部邏輯簡單,效率比Apache的BeanUtils更高。

4 總結

針對平臺二維數據的需求場景選擇不同的拷貝工具類,實現數據的轉換。將灃西新城CIM 基礎平臺構建為一個不僅是數據展示,更是數據管理的載體。對于平臺性能要求較高的場景,可采用Spring 的BeanUtils,如有更多的格式驗證、訪問控制的需求,可采用Apache的BeanUtils。使用過程中應注意以下幾點:

⑴涉及數值類型的封裝類像Integer、Short、Long、Double的數據轉換時,Spring BeanUtils需要手動初始化,否則提示數據轉換異常。而Apache BeanUtils 內置轉換器,無需擔心初始化問題。

⑵兩個拷貝工具類方法的傳參順序是相反的,SpringBeanUtils 的參數順序是(source,dest),而ApacheBeanUtils順序為(dest,source)。

⑶ Spring 的BeanUtils 可指定忽略字段,實現Bean的部分屬性拷貝。

⑷涉及Date 對象的數據轉換時,需注意Apache的BeanUtils 不支持until 包下的Date 類,應使用sql 下的Date類,避免數據異常。

此外,BeanUtils 并不是任何場景都適用的。BeanUtils 的不足之處在于其本質是淺拷貝,涉及對象只能是單一屬性和或者幾乎不改動的子對象。一但涉及深拷貝的場景,BeanUtils 是無法滿足的。另外,雖然使用BeanUtils 進行屬性拷貝十分方便,極大的減少了代碼冗長,但由于各種驗證、獲取及調用方法、序列化等對象操作,BeanUtils 的消耗時間實際上比手動調用Getter/Setter的時間長,因此要合理使用。

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 国产精品福利一区二区久久| 亚洲一区二区三区国产精华液| 黄片在线永久| 亚洲香蕉久久| 性做久久久久久久免费看| 亚洲性影院| 99re精彩视频| 香蕉精品在线| 精品欧美一区二区三区在线| 精品国产免费第一区二区三区日韩 | 欧美日韩国产综合视频在线观看| 久久综合成人| 精品一区二区久久久久网站| 22sihu国产精品视频影视资讯| 久久黄色小视频| 日本免费精品| 久久精品丝袜高跟鞋| 91色爱欧美精品www| 色婷婷色丁香| 欧美日韩午夜| 91美女视频在线| 国产午夜精品一区二区三| 欧美在线视频不卡第一页| 日韩不卡高清视频| 青青草国产免费国产| h视频在线观看网站| 久久免费视频6| 日本精品一在线观看视频| 欧美人与动牲交a欧美精品| 91成人免费观看| 亚洲人网站| 亚洲毛片在线看| 欧美午夜视频| 性色一区| 国产在线无码av完整版在线观看| 麻豆精选在线| 国产99视频精品免费观看9e| 无码在线激情片| av尤物免费在线观看| 欧美伊人色综合久久天天| av手机版在线播放| 青草视频在线观看国产| AV无码一区二区三区四区| 久久久受www免费人成| 久久福利片| 日韩午夜伦| 欧美精品v| 色婷婷成人| 国内精品91| 毛片免费在线视频| 欧美日本在线观看| 国产天天色| 亚洲国产AV无码综合原创| 亚洲大尺码专区影院| 在线日韩日本国产亚洲| 国产精品尤物在线| 亚国产欧美在线人成| 爆乳熟妇一区二区三区| 日本不卡在线播放| 国产亚洲精品无码专| 亚洲精品成人7777在线观看| 国产精品美女在线| yjizz视频最新网站在线| 国产极品美女在线| 一级香蕉人体视频| 国产黑丝一区| 中文字幕欧美日韩| 国产自产视频一区二区三区| 国产精品精品视频| 亚洲日韩精品无码专区97| 国产三区二区| 毛片久久网站小视频| 成人免费午间影院在线观看| 欧美高清三区| 色视频久久| 国产91av在线| 99视频在线观看免费| 国产97视频在线观看| 福利在线一区| 欧美黑人欧美精品刺激| 日韩午夜福利在线观看| 欧美不卡二区|