申明:本篇非本人原创,是在阅读各种论文文献之后,对论文文献的一种梳理。

主要参考文献为:

----------------------------------------------------------------我是分割线---------------------------------------------------------------------------

什么是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类库中找到源文件调用的类、方法或者静态域?的更多相关文章

  1. WebService:asp.net类库中添加WebService引用出现问题解决方法

    ylbtech-WebService:asp.net类库中添加WebService引用出现问题解决方法 1.返回顶部 1. 在Web项目内添加WebService的引用是件很简单的事情,今天在类库中添 ...

  2. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  3. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  4. 在C#中我们能调用一个类的私有方法吗

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.

  5. 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用

    前面的几篇文章已经比较完整地解释了怎么使用Log4Net,但是我们可能需要将Log4Net的日志类封装在自己的类库中,以便C/S或B/S程序进行调用.下面的示例程序简单地分为两层,一个是应用程序层We ...

  6. 在C#中使用反射调用internal的方法

    MSDN上解释Internal如下: The internal keyword is an access modifier for types and type members. Internal t ...

  7. Java 中父类怎么调用子类的方法?

    父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...

  8. 为什么static方法中不可以调用非static方法

    Java是面向对象的语言,所有的变量,方法都是针对对象而言的.一般来说,要调用一个方法,你需要new 这个方法的对象. 什么时候用static? 如果你想要: 对于一个类的所有对象共享一个变量或者是方 ...

  9. ASP.NET4.0中JavaScript脚本调用Web Service 方法

    环境:VS2019  .net 4.0 framework 根据教材使用ScriptManager在JavaScript中调用Web service 时,失败.现将过程和解决方法记录如下: 1.定义W ...

随机推荐

  1. OA

    OA(政府) http://zw.wuzhitong.com/oa_wuzhitong/index.asp http://www.wuzhitong.com/Information_ZW.html O ...

  2. CF#335 Sorting Railway Cars

    Sorting Railway Cars time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. XCOJ 1103 (LCA+树链最大子段和)

    题目链接: http://xcacm.hfut.edu.cn/problem.php?id=1103 题目大意:链更新.链查询,求树链的最大子段和.(子段可以为空) 解题思路: 将所有Query离线存 ...

  4. 定位absolute使内联支持宽高(块属性变为内联,内容默认撑开)margin auto 失效

    relative   没脱离文档流 absdute 完全脱离文档流 margin :auto 失效 相对整个文档偏离 相对父级定位 fixed 脱离文档流 与绝对定位特性一致 3.P标快不能包块级标签 ...

  5. ACM 括号配对问题

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  6. Leetcode Remove Nth Node From End of List

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  7. ACM: Long Live the Queen - 树上的DP

    Long Live the Queen Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u D ...

  8. Codeforces #Round 376 F 题解

    F. Video Cards time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. 主席树+启发式合并(LT) BZOJ3123

    好久没做题了,写道SBT又RE又T 查询:主席树裸题. 修改:对于两个树合并重建小的树. 注意fa[x][i]重新计算时要清空 #include<cstdio> #include<c ...

  10. JAVA递归算法

    1.什么是递归算法 递归算法就是直接或间接调用自己的算法 2.问题1:一列数的规则如下: 1.1.2.3.5.8.13.21.34 ,求第30位数是多少?使用递归实现 public class Fib ...