Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?

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

主要参考文献为:

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个组件,它们分别是:

Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?

在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类库中找到源文件调用的类、方法或者静态域?

上一篇:volatile和synchronized的区别和联系


下一篇:mysql查询各种类型的前N条记录