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_length
	u1 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_count
	remote_method_info remote_methods[remote_methods_count]
	u1 hash_modifier_length
	u1 hash_modifier[hash_modifier_length]
	u1 class_name_length
	u1 class_name[class_name_length]
	u1 remote_interfaces_count
	class_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_hash
	u2 signature_offset
	u1 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文件中定义的子类可继承的公共或受保护的虚拟方法的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563022.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wasm 系列之 WebAssembly 和 emscripten 暴力上手

wasm 是什么? wasm 是 WebAssembly 的缩写。wasm 不是传统意义上的汇编语言,而是一种编译的中间字节码,可以在浏览器和其他 wasm runtime 上运行非 JavaScript 类型的语言,只要能被编译成 wasm,譬如 kotlin/wasm、Rus…

Linux嵌入式驱动开发-阻塞IO与非阻塞IO

文章目录 阻塞与非阻塞访问简介阻塞访问的实现等待队列等待队列头等待队列项从等待队列头添加/移除等待队列项等待唤醒等待事件API 非阻塞访问的实现轮询poll 函数原型可以返回的资源状态 阻塞与非阻塞访问简介 **IO:**Input/Output,也就是输入/输出&am…

2024mac苹果电脑如何清理磁盘空间?用什么软件最好

苹果电脑已成为我们日常生活和工作不可或缺的一部分。随着时间的推移,不论是办公文档、个人照片还是各式各样的应用程序,都会逐渐积累,导致电脑的磁盘空间日益紧张。对于用户来说,苹果电脑如何清理磁盘空间,以保持设备…

iOS 全平台矢量动画库:体积小巧、功能丰富 | 开源日报 No.227

airbnb/lottie-ios Stars: 24k License: NOASSERTION lottie-ios 是一个用于在 iOS 平台上本地渲染 After Effects 矢量动画的库。 该项目主要功能、关键特性、核心优势包括: 跨平台支持:可在 iOS, macOS, tvOS, visionOS, Android 和 Web 上使用实时渲…

07节-51单片机-矩阵键盘

文章目录 1矩阵键盘原理2.扫描的概念3.弱上拉4.实战-实现矩阵键盘对应按钮按下显示对应值4.1配置代码模板 5.键盘锁 1矩阵键盘原理 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读…

前程贷v6.5系统测试报告

1.引言部分 1.1 项目背景 本测试报告的具体编写目的,指出预期的读者范围。(3-4句) 项目描述 (项目内容,用户需求) 本测试报告为**(系统名称)**系统测试报告;本报告目的在于总结测试…

【JavaEE初阶系列】——数据链路层以太网以及Mac地址

目录 🚩认识以太网 🚩以太网帧格式 🚩IP地址和Mac地址各自的用途 🚩认识以太网 "以太网"不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内…

在ios设备上运行Unity Profiler

久违了朋友们。 最近基于Unity 2021.3 和AR Foundation开发了个应用,需要在ipad上实际运行时查看程序的各项指标功耗。 于是乎,我尝试跟随者官方教程来实时调试,现在附上一些心得。 按照官方的三步走,Build and Run理论上会自动…

SSH远程连接服务实战

题目: 一.配置两台主机 主机1、 主机名: server.example.com ip: 192.168.78.129 建立用户timinglee,其密码为timinglee 主机2、 主机名:client.example.com ip: 192.168.78.128 2.安需求完成项目 192.168.78.128 在远程登录192.168.78.129的…

MySQL处理并发访问和高负载的关键技术和策略

大家好,我是咕噜铁蛋。今天,我想和大家聊聊MySQL处理并发访问和高负载的关键技术和策略。在当今这个数据爆炸的时代,数据库作为数据存储和处理的核心,其性能的稳定性和高效性显得尤为重要。MySQL作为广泛使用的关系型数据库管理系…

【语音识别】在Win11使用Docker部署FunASR服务器

文章目录 在 Win11 使用 Docker 部署 FunASR 服务器镜像启动服务端启动监控服务端日志下载测试案例使用测试案例打开基于 HTML 的案例连接ASR服务端 关闭FunASR服务 在 Win11 使用 Docker 部署 FunASR 服务器 该文章因官网文档不详细故写的经验论 官网文章:https:/…

安装多个MySQL版本时如何连接到不同的数据库

当安装多个版本的数据库时,不同版本的端口名不一样,可以使用以下命令进行连接 mysql -uroot -p数据库密码 -h主机名 -P端口号 数据库主机名默认是localhost,端口号默认是3306,当安装多个版本数据库时,需要记住数据库的…

Prompt-to-Prompt Image Editing with Cross Attention Control

Prompt-to-Prompt Image Editing with Cross Attention Control TL; DR:prompt2prompt 提出通过替换 UNet 中的交叉注意力图,在图像编辑过程中根据新的 prompt 语义生图的同时,保持图像整体布局结构不变。从而实现了基于纯文本(不…

2024HW --->蓝队面试题

这段时间在写横向移动,搞得鸽了很久(内网真的很玄学) 还没写完。。。 但是这不是准备HW了吗。小编也来整理一下自己收集到的题目吧!!! (仅为个人见解,不代表最终答案)&…

select实现echo服务器的并发

select实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/select.h> #include <sys/time.h…

Nodejs - 异步I/O

异步I/O 利用单线程&#xff0c;远离多线程死锁&#xff0c;状态同步等问题&#xff0c;利用异步I/O&#xff0c; 让单线程原理阻塞&#xff0c;更好的使用cpu异步I/O实现现状 阻塞IO 操作系统内对于I/O只有两种方式: 阻塞和非阻塞。在调用阻塞I/O的时候&#xff0c;应用程序需…

无损以太网的ROCE革命,队列的缓存空间优化分析

ROCE无损以太网&#xff0c;队列的缓存空间优化 多级缓存架构优化芯片性能&#xff1a;* 缓存空间细分为芯片级、端口级和队列级&#xff0c;实现精细管理。* 无损队列引入Headroom缓存空间&#xff0c;确保数据完整性。 在芯片层面&#xff1a; 静态缓存为端口提供保证的缓存空…

Tomcat弱口令及war包漏洞复现(保姆级教程)

1.环境搭建 靶机&#xff1a;Ubuntu 安装参考&#xff1a;安装Ubuntu详细教程_乌班图安装教程-CSDN博客 vulhub docker搭建tomcat漏洞环境 参考&#xff1a;vulhub docker靶场搭建-CSDN博客 工具&#xff1a;burpsuite 2.漏洞复现 2.1弱口令爆破 进入http://192.168.143…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络&#xff0c;如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息&#xff0c;一般是通过…

创新案例|Amazon.com 2023 年营销策略:电子商务零售巨头商业案例研究

2022 年最后一个季度&#xff0c;亚马逊报告净销售额超过 1,492 亿美元。这种季节性峰值是亚马逊季度报告的典型特征&#xff0c;但增长是不可否认的&#xff0c;因为这是该公司有史以来最高的季度。毫无疑问&#xff0c;这家电商零售巨头继续引领电商增长。本文将介绍我们今天…