Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?
申明:本篇非本人原创,是在阅读各种论文文献之后,对论文文献的一种梳理。
主要参考文献为:
----------------------------------------------------------------我是分割线---------------------------------------------------------------------------
什么是Javacard API?
Javacard API也被称为API类库或类库,按照包、类和接口/方法的层次结构提供了一系列标准的库函数,为Javacard 应用程序的开发人员提供了标准的接口。
通过这个接口就可以请求系统服务和系统资源,应用开发者不需要了解复杂的智能卡系统就可以开发出智能卡applet了。
这样的API设计也体现了分层思想。
Javacard API 是怎样跟解释器集成的呢?
上诉问题可以分解为三个问题:
1、Javacard 解释器怎样在API库类中找到源文件调用的类、方法或者静态域?
2、Javacard 解释器怎样处理找到的类、方法或者静态域?
3、在API中是如何实现具体的类、方法和静态域?
本篇文章首先解决第一个问题。
概括地来说:
在Java智能卡中,无论是类库还是应用程序applet,转换器已经为所有的类和实例化方法都分配了一个值,被称为token值。
Applet运行时,解释器根据token值作为索引,利用CAP文件各组件中具体的包信息、类信息和方法信息,完成对类、方法和域引用的解析。这就是token动态链接原理。这个问题就是Applet对于调用外包的具体解析过程。
下面详细讲解这个过程。
Applet对于调用外包的解析设计到两个文件:CAP文件和Export文件。
Export文件主要描述了Applet和引用包之间的关联关系,包含了当前类所在的包完整的公有方法的连接信息,并且为当前的类、方法和域都分配了不同的token值。
CAP文件是通过卡外虚拟机convert将Java编译生成的.class文件转换为更为紧凑集中的.cap文件。在卡内,Javacard虚拟机解释器对这个CAP文件进一步解析。
根据最新的sun公司的Javacard规范,一个CAP包含12个组件,它们分别是:
在Applet调用外包的解析过程中,主要涉及到Applet自身包的常量池组件(ConstantPool.cap)和导入组件(Import.cap)和该Applet所调用外包的导出组件(Export.cap)、类组件(Class.cap)和方法组件(Method.cap)。
那具体又是怎样通过这些组件在API类库中找到源文件调用的类、方法和域的呢?
第一步,
解释器从常量池组件(COMPONENT_ConstantPool)出发,在常量池组件中获取该方法所在包的索引、类的token值和方法的token值。
第二步,
根据刚才获得的方法所在包的索引,在Applet所在包的导入组件(COMPONENT_Import)获取包号。根据包号,解释器就可以跳转到该方法所在的类所属的包。
第三步,
这个时候解释器已经跳转到外部的包。根据第一步获得的方法所在类的token值,在导入包的导出组件(COMPONENT_Export)中提取该方法所在的类在类组件(COMPONENT_Class)的偏移量。
第四步,
根据上一步获得的方法所在的类在类组件(COMPONENT_Class)中的偏移量,在类组件中找到这个类的类信息。并根据第一步获得的方法的token值,在类组件中获取实例化方法在方法组件(COMPONENT_Method)中的偏移量。
第五步,
根据上一步获取的实例化方法在方法组件(COMPONENT_Method)中的偏移量找到具体的方法。至此,解释器就获得了外包实例化方法的地址,紧接着将继续执行该方法的字节码,进而完成一次对外包实例化方法的调用。
上面的步骤通过图表来表示如下:
Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?的更多相关文章
- WebService:asp.net类库中添加WebService引用出现问题解决方法
ylbtech-WebService:asp.net类库中添加WebService引用出现问题解决方法 1.返回顶部 1. 在Web项目内添加WebService的引用是件很简单的事情,今天在类库中添 ...
- 第7.22节 Python中使用super调用父类的方法
第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- 在C#中我们能调用一个类的私有方法吗
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.
- 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
前面的几篇文章已经比较完整地解释了怎么使用Log4Net,但是我们可能需要将Log4Net的日志类封装在自己的类库中,以便C/S或B/S程序进行调用.下面的示例程序简单地分为两层,一个是应用程序层We ...
- 在C#中使用反射调用internal的方法
MSDN上解释Internal如下: The internal keyword is an access modifier for types and type members. Internal t ...
- Java 中父类怎么调用子类的方法?
父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...
- 为什么static方法中不可以调用非static方法
Java是面向对象的语言,所有的变量,方法都是针对对象而言的.一般来说,要调用一个方法,你需要new 这个方法的对象. 什么时候用static? 如果你想要: 对于一个类的所有对象共享一个变量或者是方 ...
- ASP.NET4.0中JavaScript脚本调用Web Service 方法
环境:VS2019 .net 4.0 framework 根据教材使用ScriptManager在JavaScript中调用Web service 时,失败.现将过程和解决方法记录如下: 1.定义W ...
随机推荐
- eclipse 异常Unhandled event loop exception解决办法
http://blog.csdn.net/leiswpu/article/details/26712709
- Java keytool 使用总结
Keytool 是一个Java 数据证书的管理工具 ,Keytool 将密钥(key)和证书(certificates)存在一个称为keystore的文件中. 在keystore里,包含两种数据: ( ...
- BZOJ2448 : 挖油
$f[i][j]$表示仅考虑$[i,j]$区间的答案,则 $f[i][j]=\min(\max(f[i][k-1],f[k+1][j])+a[k]),i\leq k\leq j$ 维护出$\max$的 ...
- node.js 实现一个简单的登录拦截器
拦截器在web开发中随处可见,比如站点的管理后台,不说所有人都能进入,所以就需要做一个拦截器并友好的跳转到提示页. 下面我们简单实现一种,判断用户是否登录成功,登录不成功的用户自动重定向到登录页面. ...
- 据说最近IMO中国队失利的一题
(图基于Microsoft PaintBrush技术构建) 平面几何是可以难得出蛆的.这道题难在多圆.高度非对称和具有一定复杂性.如图,对ABC,H是垂心,O是垂足,M是中点.QK在ABC外接圆上,均 ...
- RMQ问题之ST算法
RMQ问题之ST算法 RMQ(Range Minimum/Maximum Query)问题,即区间最值问题.给你n个数,a1 , a2 , a3 , ... ,an,求出区间 [ l , r ]的最大 ...
- JS:操作样式表3:内联和外链样式
var box = document.getElementById("box"); box.style.属性;只能读取修改行内样式. //访问元素样式2,对外链样式表进行操作 do ...
- linux文本操作界面 vi面板如何复制一行
linux文本操作界面 vi面板如何复制一行 1)把光标移动到要复制的行上2)按yy3)把光标移动到要复制的位置4)按p 在vi里如何复制一行中间的几个字符?如果你要从光标处开始复制 4 个字符,则先 ...
- nodejs模仿http请求组件nodegrass简单例子
1.搭建nodejs环境. 2.执行npm install nodegrass命令. 3.引入模块,var ng= require(nodegrass); 4.下面先看nodegrass底层的get方 ...
- checkbox全选与反选
用原生js跟jquery实现checkbox全选反选的一个例子 原生js: <!DOCTYPE html> <html lang="en"> <hea ...