、 方法、屬性引用信息。
[0036] Java卡支持引用API或者已經下載的庫類型的Java卡應用文件中的類,進行方法 的調用或者屬性的讀寫。具體來說,以調用引用的其它類的靜態方法中定位包的過程為例, 參照cap文件中的結構定義,流程如下:靜態方法調用的字節碼:invokestatic index。
[0037] 在C0MP0NENT_ConstantPool中,以index作為下標,獲得constant_pool單元。對應 constant_pool單元中,獲取external_ref 中的package_token單元。在C0MP0NENT_Import 中,以package_token作為下標,獲得package_info單元。在package_info單元中,獲取引用 package的AID。在Heap中遍歷所有的cap文件,在目標cap文件的Header Component組件中 獲取AID與引用AID比對,匹配的即為引用的目標cap文件,進而獲取目標引用CAPREF。
[0038] 在目標cap文件的Export Component中,根據class token和token獲得對應的靜 態方法偏移static_method_offset。在目標cap文件的Method Component中,使用static_ method_ofTset作為偏移即可獲取對應的方法信息。
[0039] 步驟S3,將引用信息所相應的目標信息以擴展的類型結構回填到常量池組件 constant-pool 中;
[0040] 下面分別根據外部引用關系的不同類型,分別對回填方式進行說明:
[0041] (1)當外部引用關系為方法信息時,將目標cap包引用信息、目標cap包的方法偏移 量回填到constant-pool 〇
[0042] 具體的constant_pool修改包括: CONSTANT-StaticMethodref-info { ul tag (06) union { { ul padding u2 offset } internalref
[0043] { ul package token: ul e Lass-token ul token } externa[ref } static-methodref }
[0044] 修改為: CONSTANT-StaticMethodref-info { CAPREF ref
[0045] u2 offset )
[0046] 在預操作中定位引用包CAPREF以及方法偏移量,并回填常量池 constant_pool。虛 擬機使用新的結構不再需要跳轉和遍歷,可以直接索引到目標的方法信息。
[0047] (2)外部引用關系為屬性信息時,將目標cap包的對象引用信息、目標cap包關聯靜 態對象的屬性在靜態對象中的偏移量回填到constant_pool; CONSTANT-StaticFieldref-info {
[0048] ul tag union { f ul padding (05) u:2 offset } internal_ret {
[0049] u1 package-token ul classtoken ul token } externaljref } stat i c fi e:l.d_ref }
[0050] 修改為: CONSTANT_StaticFieldref_inf〇 { OBJREF image
[0051] υ2 offset }
[0052] 在預操作中定位引用包所關聯的靜態對象0BJREF,以及屬性在靜態對象中的偏移 量,回填至常量池組件constant_ po〇l。虛擬機使用新的結構不再需要跳轉和遍歷,可以直 接索引到目標的屬性信息。
[0053] (3)外部引用關系為類信息時,將目標cap包引用信息、目標cap包的類信息的偏移 量回填到constant-pool 〇 CONSTANT-Classmf-info { ul tag (01) union { u2 internal_class_ref { ul package token
[0054] ^ ul e 1 as:s_token } external-classref } class: ref ul pddding }
[0055] 修改為: CQHSTMT _€1:α8 s:re:f _i nfo: { CAPRBF ref
[0056] u2 offset }
[0057] 在預操作中定位引用包CAPREF以及類信息的偏移量,并回填至常量池組件 C〇nstant_p〇〇l。虛擬機使用新的結構不再需要跳轉和遍歷,可以直接索引到目標的類信 息。
[0058] 步驟S4, java卡應用程序解釋器在運行態可以直接在常量池組件constant_pool 中通過修改后的結構索引到目標信息。
[0059] 根據本發明實施例的java卡虛擬機的優化方法,可以省去java卡應用程序在運行 時為定位目標進行的大量內部跳轉以及外部遍歷等性能低下問題,直接定位到目標信息, 提高了 java卡的運行效率,在不改變硬件設備的情況下,有效提升了 java卡虛擬機的運行 效率。
[0060] 如圖2所示,本發明實施例的java卡虛擬機的優化系統,包括:下載模塊1、遍歷模 塊2、預操作模塊3和回填模塊4。
[0061]具體的,下載模塊1用于下載java應用程序,該java卡應用程序為一個cap包。每個 java卡應用程序均是以cap包為單位,即一個java卡應用程序就是一個cap包。每個cap包中 包括有多個用于虛擬機解析執行的組件component,以及用來索引component組件的常量池 組件constant pool。常量池組件constant_pool包括對內部和外部應用操作數據的索引。 [0062]例如,在java卡內使用可實現空間動態管理的數據結構,堆(Heap)來管理可編程 存儲器,所有包和對象都存儲在Heap中。其中,用來索引Heap中單元的引用定義為HEAPREF, 指向Heap中包類型數據的HEAPREF定義為CAPREF,指向Heap中對象類型數據的HEAPREF定義 為0BJREF,類引用CLAREF采用CAPREF和cap內部偏移索引類信息,方法引用MSTREF采用 CAPREF和cap內部偏移索引類信息。每個對象都包含多個屬性,每個屬性都要占用一定存儲 空間,某一具體屬性在對象空間的內部偏移定義為FLD0FF。常量池用來存儲常量信息。
[0063] 遍歷模塊2與下載模塊1相連,用于在下載模塊1下載java卡應用程序的過程中,通 過對cap包中的常量池組件constant_pool進行遍歷,以獲取對組件的外部引用關系,作為 引用信息。
[0064] 在本發明的一個實施例中,引用信息包括:目標cap包引用信息、目標cap包的類、 方法、屬性引用信息。
[0065] 預操作模塊3與遍歷模塊2相連,用于通過預操作獲取引用信息所對應的目標信 息。
[0066] 回填模塊4與預操作模塊3相連,用于將引用信息所相應的目標信息以擴展的類型 結構回填到常量池組件constant_pool中,則java卡應用程序解釋器在運行態可以直接在 常量池組件constant_pool中通過修改后的結構索引到目標信息。
[0067] Java卡支持引用API或者已經下載的庫類型的Java卡應用文件中的類,進行方法 的調用或者屬性的讀寫。具體來說,以調用引用的其它類的靜態方法中定位包的過程為例, 參照cap文件中的結構定義,流程如下:靜態方法調用的字節碼:invokestatic index。
[0068] 在C0MP0NENT_ConstantPool中,以index作為下標,獲得(3〇118七31^_口〇〇1單元。對應 constant_pool單元中,獲取external_ref 中的package_token單元 中,以package_token作為下標,獲得package_info單元。在口8〇1^86_;!_11:[>0單元中,獲取引用 package的AID中遍歷所有的cap文件,在目標cap文件的Header Component組件中 獲取AID與引用AID比對,匹配的即為引用的目標cap文件,進而獲取目標引用CAPREF。
[0069] 在目標cap文件的Export Component中,根據class token和token獲得對應的靜 態方法偏移static_method_off setD在目標cap文件的Method Component中,使用static_ method_offset作為偏移即可獲取對應的方法信息。
[0070] (1)當外部引用關系為方法信息時,回填模塊4將目標cap包引用信息、目標