JavaCard学习笔记: CAP Component 之 Class Component

2024-04-22 11:52

本文主要是介绍JavaCard学习笔记: CAP Component 之 Class Component,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 整体结构
  • tag和size字段
  • signature_pool_length和signature_pool
  • type_descriptor结构
    • 导入类型编码
    • 导入项签名示例
      • 导入类
      • 导入数组
      • 导入远程方法
  • interfaces[]
    • interface_info结构
    • flags
    • inteface_count
    • superinterfaces
    • interface_name
  • class_info_compact classes[]
    • 结构
    • flags
    • inteface_count
    • super_class_ref
    • declared_instance_size
    • first_reference_token
    • reference_count
    • public_method_table_base
    • public_method_table_count
    • package_method_table_base
    • package_method_table_count
    • public_virtual_method_table[]
    • package_virtual_method_table[package_method_table_count]
    • interfaces[interface_count]
      • implemented_interface_info结构
    • remote_interface_info remote_interfaces
      • remote_method_info remote_methods[remote_methods_count]
        • remote_method_info
      • u1 hash_modifier[hash_modifier_length]
      • u1 class_name[class_name_length]
      • class_ref remote_interfaces[remote_interfaces_count]
    • u1 public_virtual_method_token_mapping[public_method_count]
    • CAP22_inheritable_public_method_token_count

整体结构

Class Component的紧凑格式和扩展格式结构如下,本篇笔记只记录了紧凑格式的内容。

class_component_compact { u1 tag u2 size u2 signature_pool_length (since CAP format 2.2)type_descriptor signature_pool[](since CAP format 2.2)interface_info interfaces[] class_info_compact classes[]
}class_component_extended { (since CAP format 2.3)u1 tag u2 size u2 signature_pool_length type_descriptor signature_pool[] interface_info interfaces[] class_info_extended classes[]
}

tag和size字段

所有组件开头都是这两个字段,tag表示组件类型,size表示组件大小。

signature_pool_length和signature_pool

signature_pool是一个长度为signature_pool_length个字节(注意不是数组元素个数)的type_descriptor类型数组,用以表示远程方法的签名。
我个人的理解是:在类定义的.java文件中,前面可能会出现类似importXXX的语句,signature_pool数组中的每一项就表示一个导入项的签名,签名的具体内容由【导入类型】+【位置索引】组成。如果导入的是一个方法,签名的具体内容由【导入类型】+【位置token】+【返回类型】组成。

type_descriptor结构

type_descriptor的结构定义如下

type_descriptor { (since CAP format 2.2)u1 nibble_count; u1 type[(nibble_count+1) / 2]; 
}

导入类型编码

存在11种导入类型,编码如下。
在这里插入图片描述

导入项签名示例

导入类

类和方法都属于reference类型。如果package0要导入package1中的c1类,需要6个nibble,该type_descriptor的type占3个字节,具体值如下。
在这里插入图片描述

导入数组

在这里插入图片描述

导入远程方法

在这里插入图片描述

interfaces[]

表示所有接口的信息,数组中每项用interface_info结构表示单个接口的信息。

interface_info结构

interface_info { u1 bitfield { bit[4] flags bit[4] interface_count } class_ref superinterfaces[interface_count] interface_name_info interface_name
} 

flags

这个字段接口和类通用,定义如下:
在这里插入图片描述
flags字段的最高位(0x8)置1表示是接口info,置0表示类info。0X4位置1表示共享接口或共享类,0则反之。0x2位置1表示远程接口或远程类,0则反之。

inteface_count

表示该接口的父接口数。

superinterfaces

一个class_ref类型的数组,存放该接口所有父接口的位置token。

interface_name

非远程接口该项为空。
远程接口,该项的结构如下。interface_name_length表示接口名字的长度,随后就是接口名字的内容, 以UTF-8 格式存放。

interface_name_info {u1 interface_name_lengthu1 interface_name[interface_name_length]
} 

class_info_compact classes[]

表示所有类的信息,紧凑版中每项用class_info_compact结构表示单个类的信息。

结构

class_info_compact { u1 bitfield { bit[4] flags bit[4] interface_count } class_ref super_class_ref u1 declared_instance_size u1 first_reference_token u1 reference_count u1 public_method_table_base u1 public_method_table_count u1 package_method_table_base u1 package_method_table_count u2 public_virtual_method_table[public_method_table_count] u2 package_virtual_method_table[package_method_table_count] implemented_interface_info interfaces[interface_count] remote_interface_info remote_interfaces (since CAP format 2.2)u1 public_virtual_method_token_mapping[public_method_count](since CAP format 2.3)u1 CAP22_inheritable_public_method_token_count(since CAP format 2.3)
} 

flags

这个字段接口和类通用,见上方接口flags描述。

inteface_count

表示该类实现的接口数。仅包括该类直接实现的接口数,不包括其父类实现的接口。如下例子中,c0类实现了接口i0,其inteface_count为1;c1类实现了接口i1、i2、i3,其inteface_count为3。注意,c1类没有直接实现i0,接口i0是由其父类c0实现的。

interface i0 {} 
interface i1 {} 
interface i2 extends i1 {} 
interface i3 {} 
class c0 implements i0 {} 
class c1 extends c0 implements i2, i3 {} 

super_class_ref

该类的父类。Java仅支持单继承,所以只有一个引用,不是数组。

declared_instance_size

类中声明的所有成员变量需要的内存大小,以16位为一个单位。其中,除了int类型的成员变量会占用2个16位,其它类型都只用1个16位。

first_reference_token

表示该类第一个引用变量的类型。JavaCard的引用类型有4种,如下图。但我不理解这个字段是用来做什么的= =
在这里插入图片描述

reference_count

表示该类声明的引用类型的成员变量数。

public_method_table_base

如果该类有公有虚方法,该项的值为第一个公共虚方法的token值,即接下来的共有虚方法表public_virtual_method_table[public_method_table_count]第一项的token值。
如果该类无公有虚方法,该项的值为【父类public_method_table_base值】加上【父类public_method_table_count值】。如果该类无父类,则该项值为0.

public_method_table_count

public_virtual_method_table的项数。这个字段还有一些细节,待完善,感兴趣的可以自行查阅java智能卡虚拟机规范。

package_method_table_base

如果该类有包可见的虚方法(个人理解就是没有static关键字修饰的方法),该项的值为第一个包可见虚方法的token值,即接下来的共有虚方法表package_virtual_method_table[package_method_table_count] 第一项的token值。
如果该类无包可见虚方法,该项的值为【父类package_method_table_base值】加上【父类package_method_table_count值】。如果该类无父类,则该项值为0.

package_method_table_count

package_virtual_method_table的项数。

public_virtual_method_table[]

表示该类声明或定义的所有public或protected类型的虚方法,也可能会包含父类声明或定义的方法。数组中的每一项的值代表一个方法在Method组件中相对method_info字段起始地址的偏移量。如果该方法在另一个包里,则该项的偏移量为0xff。

package_virtual_method_table[package_method_table_count]

表示所有包内可见的虚方法。个人理解就是没有static关键字修饰的虚方法。其它细节的应以应该可以参考public_virtual_method_table[].

interfaces[interface_count]

表示该类直接实现的所有接口的信息。

implemented_interface_info结构

implemented_interface_info { class_ref interface u1 count u1 index[count] 
} 

interface为接口的引用,count代表接口的实现数量,index中每一项表示一种【实现】的【虚方法】的【token值】。

remote_interface_info remote_interfaces

如果前面的flags中,ACC_REMOTE为0,则该字段为空。如果非0,表示这是一个remote接口,remote_interface_info的定义如下

remote_interface_info { (since CAP format 2.2)u1 remote_methods_countremote_method_info remote_methods[remote_methods_count]u1 hash_modifier_lengthu1 hash_modifier[hash_modifier_length]u1 class_name_lengthu1 class_name[class_name_length]u1 remote_interfaces_countclass_ref remote_interfaces[remote_interfaces_count] 
}

remote_method_info remote_methods[remote_methods_count]

remote_method_info
remote_method_info { (since CAP format 2.2)u2 remote_method_hashu2 signature_offsetu1 virtual_method_token
} 

数组的每一项包含3个信息:

  1. remote方法的哈希值,该值在同一类内是唯一的。
  2. 方法参数的类型定义,即在签名池中的偏移。
  3. 该类的远程方法的虚拟方法token。

u1 hash_modifier[hash_modifier_length]

防冲突字符串。相关定义和作用可自行百度。

u1 class_name[class_name_length]

顾名思义,这个类的名字。

class_ref remote_interfaces[remote_interfaces_count]

每一项都是一个引用,指向一个interface_info结构。

u1 public_virtual_method_token_mapping[public_method_count]

方法的token值映射,把【当前类中某个方法的token值】映射到【父类中该方法的token值】。这里可以看出来,虽然是同一个方法,但在父类和子类中的token值可能是不一样的。
特殊情况:类内定义的方法,映射入参为0xff。
举个例子,如果类C1是类C2的父类,C1中方法的映射入参为T1,C2中方法的映射入参为T2,那么有以下关系:

T1=C2.public_virtual_method_token_mapping[T2]

CAP22_inheritable_public_method_token_count

CAP22_inheritable_public_method_token_count项表示由2.2或更早版本的CAP文件中定义的子类可继承的公共或受保护的虚拟方法的数量。

这篇关于JavaCard学习笔记: CAP Component 之 Class Component的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925708

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备