重置后,以不同方式声明和初始化的持久数组会发生什么?

时间:2018-05-04 01:21:41

标签: java applet javacard

假设在重置卡之前调用了applet构造函数和processToolkit方法。 假设在重置卡后只调用applet构造函数,而不是processToolkit方法。

我有以下三个关于重置后Object头的状态的问题。

  1. 数组A的对象标头是有效还是垃圾?
  2. 数组B的对象标头是有效还是垃圾?
  3. 数组C的对象标头是有效还是垃圾?
  4. 以下代码:

    public class TestApplet extends Applet 
    { 
    
        private byte[] A;
        private byte[] B;
    
        protected TestApplet() {
            A = JCSystem.makeTransientByteArray(100, JCSystem.CLEAR_ON_RESET);
        }
    
        public static void install(byte[] bArray, short bOffset, byte bLength) {
            TestApplet appToRegister = new TestApplet();
            appToRegister.register();
        }
    
        public void processToolkit(short event) throws ToolkitException {
            byte[] C;
            C = JCSystem.makeTransientByteArray(100, JCSystem.CLEAR_ON_RESET);
            B = JCSystem.makeTransientByteArray(100, JCSystem.CLEAR_ON_RESET);
        }
    }
    

2 个答案:

答案 0 :(得分:3)

根据合理且负责任的JavaCard编程风格,你不应该有C并且应该在构造函数中将A放在A旁边,并且在从install()安装applet期间只调用一次构造函数。其余部分在JavaCard运行时环境规范中进行了描述。

答案 1 :(得分:2)

每个实例只能调用一次applet构造函数。因此,如果我们讨论的是另一个实例,那么只有A将被声明为实例化。

B只会被声明,但请注意默认情况下在Java中初始化字段,特别是null用于对象引用(对 arrays 的引用被视为对象的引用)爪哇)。

当然,C还不知道。它位于processToolkit的本地,因此它不会存在。

请注意,操作中似乎缺少对Applet.register的调用,因此实例化后实例可能无法使用。

C的早期实例(对象标头)声明的持久性内存当然可能需要进行垃圾收集。 C是Java Card中已知的坏模式;你不会声称持久性内存只会在Java Card中丢弃引用。