在 Java Card(我对 Classic 一直到 2.1.1 感兴趣)中,applet 所需的瞬态(RAM)通常在安装时由makeTransientByteArray()
. 该方法接受一个参数CLEAR_ON_RESET
或CLEAR_ON_DESELECT
。后者带有警告
CLEAR_ON_DESELECT
仅当创建对象的小程序与当前选定的小程序处于同一上下文中时,才能访问瞬态对象。
CLEAR_ON_DESELECT
如果在当前选定的小程序与创建对象的小程序不在同一上下文中时访问瞬态对象,Java Card 运行时环境将抛出 SecurityException 。
我的阅读是CLEAR_ON_DESELECT
(但不是CLEAR_ON_RESET
)将允许运行时覆盖两个小程序之间的瞬态(如上所述在安装时分配),只要它们没有同时被选中,这样分配m j字节的几个小程序将消耗大约 max( m j ) 瞬态字节,而不是 sum( m j )。
更新:有人告诉我,至少在某些运行时环境中,覆盖选择性地发生在从不同包分配的瞬态中。但我找不到参考,或对此类规则/机制的精确描述。
问题:这种覆盖机制有时会在运行时实现吗?如果是,什么时候发生?是否有运行时没有实现它的卡?如果是的话,除了实验之外,有没有其他方法可以判断,可能是从广告中的 Java Card 版本?
其他问题:引用的限制中的“上下文”到底是什么意思?特别是,一个小程序的另一个实例是否可以使用瞬态,并与此处CLEAR_ON_DESELECT
显示的机制分配的实例共享它?注意:我对共享瞬态的内容不感兴趣,只是为了避免两次分配,以解决运行时可能缺少覆盖的问题。
更新:我在这里问了同样的问题,得到了一个有趣的答案。