System.ArgumentOutOfRangeException: 索引和長度必須引用該字符串內的位置。 參數名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技術實現步驟摘要】
本專利技術涉及計算機,具體地,涉及一種生成轉換器的方法和系統。
技術介紹
1、目前有兩種主流的對象轉換方案:一種是基于反射機制實現(典型工具為:spring框架中的beanuti?ls工具和apache?common框架中的beanut?ils工具),通過運行時反射獲取對象的屬性信息,完成屬性值拷貝,這種方案的缺點在于每次轉換操作都需要進行運行時反射,對于轉換頻率比較高的場景(例如并發量較大的應用服務器)會產生較大的性能損失(在模擬的性能測試中,操作耗時有十倍左右的差距),極端情況下可能會影響服務的正常處理;另一種是基于編譯時代碼生成的技術實現(典型工具為:mapstruct),這種方案解決了反射方案的性能問題,但是通常需要在代碼中插入額外的代碼定義和注解,并且需要在編譯期執行額外的注解處理器,這通常意味著需要使用額外的編譯插件,并且需要額外的項目配置,而在程序預熱完成,穩定運行時,其理論性能與本專利技術幾乎沒有差異。
2、專利文獻cn106933554a(申請號:201511023820.3)公開了一種類轉換方法和裝置。其中,該方法包括:獲取源類對象和目標類對象,其中,源類對象為源類的對象,目標類對象為目標類的對象;獲取源類對象和目標類對象之間的映射關系;以及通過類轉換器根據映射關系和映射器執行源類對象和目標類對象之間的轉換,其中,類轉換器中預先封裝了類轉換方法,映射器中預先封裝了類轉換規則,類轉換方法用于根據類轉換規則執行類之間的轉換。然而該專利沒有采用運行時字節碼生成技術,無法解決代碼侵入和額外的編譯期插件依賴
技術實現思路
1、針對現有技術中的缺陷,本專利技術的目的是提供一種基于運行時字節碼編輯的對象轉換方法、系統、介質。
2、根據本專利技術提供的基于運行時字節碼編輯的對象轉換方法,包括:當緩存中已經存在源對象到目標對象轉換的對象轉換器,則直接調用對象轉換器完成轉換任務;否則,根據jvm的字節碼規范在程序運行時動態生成對象轉換器,并結合對象緩存技術實現高性能對象轉換;
3、jvm的字節碼是一段保存在內存中的二進制串,jvm的字節碼規范規定二進制串的格式,對象轉換器為按照jvm的字節碼規范生成的一段二進制串內容。
4、優選的,對象轉換方法包括:
5、步驟s1:根據需要轉換的源對象和目標對象的類型提取屬性或方法信息;
6、步驟s2:根據提取的屬性和方法信息,通過字節碼編輯技術在運行時生成需要的對象轉換器,并實例化后放入緩存中;
7、步驟s3:調用生成的對象轉換器完成源對象到目標對象的轉換任務。
8、優選的,所述步驟s2包括:
9、步驟s2.1:分析目標對象的屬性和方法,過濾出public屬性和setter方法;
10、步驟s2.2:在源對象的屬性和方法中根據過濾出的public屬性和setter方法尋找相對應的public屬性和getter方法;
11、步驟s2.3:基于目標對象的publ?ic屬性和setter方法以及源對象的publ?ic屬性和getter方法生成新的對象轉換器的字節碼,新的對象轉換器的字節碼包含一個方法,接收源對象和目標對象作為參數,并返回處理后的目標對象,方法邏輯中調用源對象的getter方法獲取相應屬性值,并調用目標對象的setter方法進行賦值。
12、優選的,所述步驟s2.3包括:
13、通過java反射技術獲取目標對象和源對象的類定義,找到相應的屬性和方法的名字和字段類型/參數類型,對目標對象中每一個public屬性和setter方法分別進行如下處理:尋找源對象中的publ?ic屬性和getter方法中是否有相同的名字和類型的條目,如果有則生成一個將源對象字段賦值到目標字段對象中的方法,搜索完所有字段的方法后,將生成的轉換器方法字節碼組合到一個轉換器類的字節碼中,最終生成完整的轉換器字節碼。
14、根據本專利技術提供的基于運行時字節碼編輯的對象轉換系統,包括:當緩存中已經存在源對象到目標對象轉換的對象轉換器,則直接調用對象轉換器完成轉換任務;否則,根據jvm的字節碼規范在程序運行時動態生成對象轉換器,并結合對象緩存技術實現高性能對象轉換;
15、jvm的字節碼是一段保存在內存中的二進制串,jvm的字節碼規范規定二進制串的格式,對象轉換器為按照jvm的字節碼規范生成的一段二進制串內容。
16、優選的,對象轉換系統包括:
17、模塊m1:根據需要轉換的源對象和目標對象的類型提取屬性或方法信息;
18、模塊m2:根據提取的屬性和方法信息,通過字節碼編輯技術在運行時生成需要的對象轉換器,并實例化后放入緩存中;
19、模塊m3:調用生成的對象轉換器完成源對象到目標對象的轉換任務。
20、優選的,所述模塊m2包括:
21、模塊m2.1:分析目標對象的屬性和方法,過濾出public屬性和setter方法;
22、模塊m2.2:在源對象的屬性和方法中根據過濾出的public屬性和setter方法尋找相對應的public屬性和getter方法;
23、模塊m2.3:基于目標對象的publ?ic屬性和setter方法以及源對象的publ?ic屬性和getter方法生成新的對象轉換器的字節碼,新的對象轉換器的字節碼包含一個方法,接收源對象和目標對象作為參數,并返回處理后的目標對象,方法邏輯中調用源對象的getter方法獲取相應屬性值,并調用目標對象的setter方法進行賦值。
24、優選的,所述模塊m2.3包括:
25、通過java反射技術獲取目標對象和源對象的類定義,找到相應的屬性和方法的名字和字段類型/參數類型,對目標對象中每一個public屬性和setter方法分別進行如下處理:尋找源對象中的publ?ic屬性和getter方法中是否有相同的名字和類型的條目,如果有則生成一個將源對象字段賦值到目標字段對象中的方法,搜索完所有字段的方法后,將生成的轉換器方法字節碼組合到一個轉換器類的字節碼中,最終生成完整的轉換器字節碼。
26、根據本專利技術提供的存儲有計算機程序的計算機可讀存儲介質,所述計算機程序被處理器執行時實現所述的基于運行時字節碼編輯的對象轉換方法的步驟。
27、根據本專利技術提供的電子設備,包括存儲器、處理器及存儲在所述存儲器上并可在所述處理器上運行的計算機程序,所述計算機程序被處理器執行時實現所述的基于運行時字節碼編輯的對象轉換方法的步驟。
28、與現有技術相比,本專利技術具有如下的有益效果:
29、(1)本專利技術通過采用運行時字節碼生成技術動態生成對象轉換器,解決了類型不確定的對象之間進行轉換時只能通過性能較差的反射機制才能進行轉換操作的問題;
30、(2)本專利技術通過采用本地緩存存儲動態生成的對象轉換器,解決了字節碼生成及動態類加載過程造成的性能損失本文檔來自技高網...
【技術保護點】
1.一種生成轉換器的方法,其特征在于,包括:
2.根據權利要求1所述的生成轉換器的方法,其特征在于,在對象轉換過程中,相同字段數據互相復制;
3.根據權利要求1所述的生成轉換器的方法,其特征在于,所述步驟2包括:
4.根據權利要求3所述的生成轉換器的方法,其特征在于,所述步驟2.3包括:
5.根據權利要求4所述的生成轉換器的方法,其特征在于,定義兩個類:SimpleTestBeanSrc作為源對象類型,SimpleTestBeanDist作為目標對象類型,兩個類定義為相同的結構;
6.一種生成轉換器的系統,其特征在于,包括:
7.根據權利要求6所述的生成轉換器的系統,其特征在于,在對象轉換過程中,相同字段數據互相復制;
8.根據權利要求6所述的生成轉換器的系統,其特征在于,所述模塊M2包括:
9.根據權利要求8所述的生成轉換器的系統,其特征在于,所述模塊M2.3包括:
10.根據權利要求9所述的生成轉換器的系統,其特征在于,定義兩個類:SimpleTestBeanSrc作為
...【技術特征摘要】
1.一種生成轉換器的方法,其特征在于,包括:
2.根據權利要求1所述的生成轉換器的方法,其特征在于,在對象轉換過程中,相同字段數據互相復制;
3.根據權利要求1所述的生成轉換器的方法,其特征在于,所述步驟2包括:
4.根據權利要求3所述的生成轉換器的方法,其特征在于,所述步驟2.3包括:
5.根據權利要求4所述的生成轉換器的方法,其特征在于,定義兩個類:simpletestbeansrc作為源對象類型,simpletestbeandist作為目標對象類型,兩個類定義為相同的結構;
<...【專利技術屬性】
技術研發人員:陳克松,謝金航,傅稷禹,
申請(專利權)人:歐冶工業品股份有限公司,
類型:發明
國別省市:
還沒有人留言評論。發表了對其他瀏覽者有用的留言會獲得科技券。