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文件中定义的子类可继承的公共或受保护的虚拟方法的数量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

稀碎从零算法笔记Day55-LeetCode:100291. 统计特殊字母的数量 II

今天可惜了,周赛第二题没看出来,导致第三题时间都不够,最后一题... 题目描述: 给你一个字符串 word。如果 word 中同时出现某个字母 c 的小写形式和大写形式,并且 每个 小写形式的 c 都出现在第一个大写形式的 c 之前…

基于Springboot的网上商城购物系统

基于SpringbootVue的网上商城购物系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 商品信息 商品资讯 后台登录页面 后台管理首页 用户管理 商品分类管…

JAVA 整合 亚马逊AWS S3(文件上传,文件下载等)

JAVA 整合 亚马逊AWS S3(文件上传,文件下载) 1.添加依赖 因为aws需要发送请求上传、下载等api,所以需要加上httpclient相关的依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>1.12…

记录一个hive中跑insert语句说没创建spark客户端的问题

【背景说明】 我目前搭建离线数仓&#xff0c;并将hive的执行引擎改成了Spark&#xff0c;在将ods层的数据装载到dim层&#xff0c;执行insert语句时报如下错误 【报错】 [42000][40000] Error while compiling statement: FAILED: SemanticException Failed to get a spark…

星链全解1

星链基本信息 星链卫星的寿命约为5年&#xff0c;最终目标是发射42000颗卫星。最初&#xff0c;每颗卫星重约260公斤&#xff0c;与1吨以上的大卫星相比属于“小卫星”。现在&#xff0c;向V2版进化的星链卫星重量近800公斤&#xff0c;约为老一代卫星的3倍。 点击“星链地图…

【Entity Framework】聊一聊EF如何使用数据库函数

【Entity Framework】聊一聊EF如何使用数据库函数 文章目录 【Entity Framework】聊一聊EF如何使用数据库函数一、数据库函数的类型二、内置函数与用户定义的函数四、聚合函数、标量函数和表值函数五、Niladic函数六、EF Core 中的数据库函数映射6.1 内置函数映射6.2 EF.Functi…

Redis入门到通关之数据结构解析-QuickList

文章目录 ☃️前提概要☃️ 配置项相关☃️简要源码☃️总结 Redis中的 QuickList 是一种特殊的数据结构&#xff0c;用于存储列表类型的数据。它的设计目的是在内存中高效地存储和操作大量的列表元素&#xff0c;尤其是当列表长度很大时。 QuickList的内部结构是一个由多个节…

ARM与单片机有啥区别?

初学者必知&#xff1a;ARM与单片机到底有啥区别&#xff1f;1、软件方面这应该是最大的区别了。引入了操作系统。为什么引入操作系统&#xff1f;有什么好处嘛&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教…

完全日期(蓝桥杯)

文章目录 完全日期题目描述模拟 完全日期 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021 年 6 月 5 日…

Z变换和离散傅里叶变换区别

Z变换和离散傅里叶变换&#xff08;DFT&#xff09;都是数字信号处理中的重要工具&#xff0c;它们之间有几个关键的区别&#xff1a; 定义域&#xff1a; Z变换是在整个Z平面上定义的&#xff0c;可以处理信号的整个频率范围。 DFT仅在单位圆上定义&#xff0c;对应于周期信号…

【Linux驱动层】iTOP-RK3568学习之路(二):vscode中设置头文件路径-完成代码自动补全

在Ubuntu下用vscode写Linux驱动层的时候&#xff0c;需要添加头文件&#xff1a; #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h>但vscode没有智能提示&#xff0c;因此需要我们手动添加自己的头文件路径&#xff1a; topeetu…

嵌入式Linux开发实操(十七):Linux Media Infrastructure userspace API

视频和无线电流媒体设备使用的Linux内核到用户空间API,包括摄像机、模拟和数字电视接收卡、AM/FM接收卡、软件定义无线电(SDR)、流捕获和输出设备、编解码器设备和遥控器。典型的媒体设备硬件如下: 媒体基础设施API就是用于控制此类设备的,分五个部分。 第一部分V4L2 API…

设计模式学习笔记 - 开源实战三(下):借助Google Guava学习三大编程范式中的函数式编程

概述 现在主流的编程范式主要有三种&#xff0c;面向过程、面向对象和函数式编程。在理论部分&#xff0c;已经介绍了前面两种编程范式。本章再讲讲剩下的编程范式&#xff0c;函数式编程。 函数式编程并非是一个很新的东西&#xff0c;早在 50 年前就已经出现。近几年&#…

全量知识系统 程序详细设计 之“因果关系模型”(QA百度搜索)

Q1. 今天聊聊全量知识系统&#xff08;简称“全知系统”&#xff09;中 对“因果”的理解。&#xff08;地位、意义和作用&#xff09; 在全量知识系统&#xff08;全知系统&#xff09;中&#xff0c;“因果”的理解占据着核心地位&#xff0c;其意义和作用不容忽视。以下是对…

AI安全之问:我们的智能助手真的安全吗?

在我们日益依赖人工智能来撰写文档、编写程序代码、甚至创作艺术作品的今天&#xff0c;我们是否曾经想过这些智能系统可能面临的被恶意操纵的风险&#xff1f; 分享几个网站 GPT-3.5研究测试&#xff1a; https://hujiaoai.cn GPT-4研究测试&#xff1a; https://higpt4.cn…

MKS 质量MFC流量控制器原理及应用课件PPT

MKS 质量MFC流量控制器原理及应用课件PPT

Git | Git基本命令

Git | Git基本操作 文章目录 Git | Git基本操作一、创建Git本地仓库1、创建Git仓库2、配置Git3、理解工作区、暂存区、版本库关系 二、添加、修改与查看添加文件查看历史提交记录 修改文件查看.git文件 三、版本回退版本回退撤销修改尚未add已add但还未commit已add并commit 删除…

安信可 ESP_01SWIFI模块的使用 (电脑通过usb转tll模块连接wifi模块进行调试)

一&#xff1a;需要用到的模块 &#xff08;1&#xff09;安信可的ESP_01wifi模块 ESP-01是深圳安信可科技基于ESP8266芯片开发的串口wifi模块&#xff0c;模组集成了透传功能&#xff0c;即买即用&#xff0c;支持串口指令集&#xff0c;用户通过串口即可实现网络访问…

STM32相关手册

目录 数据手册 STM32F103C8T6数据手册 STM32F429IGT6数据手册 参考手册 STM32F103C8T6参考手册 STM32F429IGT6参考手册 数据手册 STM32F103C8T6数据手册 链接&#xff1a;https://url80.ctfile.com/d/38076880-60948910-e7c11b?p9868 密码&#xff1a;9868 STM32F429IGT6数…

List的介绍

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…