我想知道是否有人知道下面的Java Card方法(我在JCIDE示例目录中找到的WalletDemoApplet的源代码的一部分)中的temp
数组的存储位置(EEPROM或RAM)。请注意,该数组不是通过makeTransientByteArray分配的。并在方法内部将其声明为局部变量。
private void calIntegral(byte [] buf,byte soff,short len)
{
byte temp[]={0x00,0x00,0x00,0x00};
short low=0;
byte aa=0;
if (len==2)
Util.arrayCopy(buf, soff, temp,(short)2, len);
else
Util.arrayCopy(buf, soff, temp,(short)0, len);
...
}
此外,在Java Card Applet Developer's Guide中,您可以找到:
转换器确保为静态字段(即原始数据类型)的内容分配内存 以及对数组的引用。通过使用系统堆中的新字节码为实例分配内存 并且无法回收(除非智能卡实现垃圾回收器)。方法的记忆 变量,局部变量和参数是从堆栈中分配的,并在方法返回时被回收。
答案 0 :(得分:4)
WalletDemoApplet
的这一部分当然不应在局部变量中生成:
byte temp[]={0x00,0x00,0x00,0x00};
那是EEPROM存储器; new byte[]
部分可能是隐藏的,但仍会执行数组创建,as specified by the JLS:
数组初始化器创建一个数组,并为其所有组件提供初始值。
这里数组初始化器是花括号和其中的所有内容。
请至少忽略示例的这一部分。通常,您将为此使用静态方法,并使用带有makeTransientByteArray
(在Applet实例化期间称为)的类字段作为缓冲区。也就是说:如果您需要数组,则只需定义4个字节变量,或者在这种情况下直接设置字节值也可以。