、 方法、属性引用信息。
[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包引用信息、目标