加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

瞬态存储器中的Java卡对象实例

发布时间:2020-12-15 08:28:18 所属栏目:Java 来源:网络整理
导读:我正在开发一个 Java Card applet(用于Java Card 2.2.1),它需要一些临时对象来处理APDU命令.我对正确的内存管理有疑问. 我花了很多时间研究这些问题,但是我没有在一些Java卡API上找到任何澄清或良好的示例代码.我有两个主要问题: 如何创建瞬态对象数组(我的
我正在开发一个 Java Card applet(用于Java Card 2.2.1),它需要一些临时对象来处理APDU命令.我对正确的内存管理有疑问.
我花了很多时间研究这些问题,但是我没有在一些Java卡API上找到任何澄清或良好的示例代码.我有两个主要问题:

>如何创建瞬态对象数组(我的意思是RAM中的自定义对象不在EEPROM中).我已经阅读了关于makeTransientObjectArray但它只返回Object类型的数组.我知道如何使用makeTransientByteArray创建例如瞬态字节数组,但我的问题是关于对象实例的瞬态数组.或者可能是java语言中的任何方式将字节数组转换为没有序列化的实例?
>我只在进入APDU命令的过程中需要这个瞬态对象数组,而不需要为我分配内存.分配此瞬态内存的最佳位置在哪里(内部安装,选择,处理,…功能)?

Edited for more explanations:

>正如我已从文档中读取的那样,任何对象实例都存储在EEPROM中.假设我知道我的过程算法中需要的最大对象数(比如说100).我在安装方法中生成了100个MyClass实例. MyClass的每个实例包含3个字段:field1 a short,field2 a byte,field3是short类型.所有这100个实例将通过输入APDU命令来填充.如果对于每个命令,我在EEPROM上填充对象,这不是一个好习惯,因为它们是临时数据. EEPROM还具有最大的循环周期.一种方法可能是,对于每个实例,我使用makeTransientByteArray和makeTransientShortArray为每个对象分配5个字节.但正如我从文档中读到的那样,它按簇(32字节 – 不确定大小)分配内存,这是无效的.那么在这种情况下我要做什么呢?
>我的意思是如何处理瞬态记忆.如果在安装功能内部分配瞬态内存,则其他小程序将无法使用.如果applet是Card上唯一的一个applet,那么在安装函数中分配所有瞬态内存是一个好习惯.我想知道所有条件的一般有效方法(单小程序设备或多小程序设备).此外,我不确定,如果在卡读卡器中插入卡,如果在安装中分配的瞬态内存将在处理功能内部可用.

解决方法

不幸的是,在Java Card的经典规范中,您尝试做的事情是不可能的.对象实例总是存储在EEPROM中,正如您已经注意到的那样.所以你必须解决这个问题.

Java是一种相对高级的语言,其中对象总是存储在一个特定的内存中.现在他们已经将这种类型的内存更改为Java Card的持久内存.但是,它需要完全重新设计语言,以允许在一种类型的存储器或另一种存储器中构造对象.现在JCF当然可以考虑使用注释 – 它仍然非常棘手,但可能是可行的.

同样,不可能只通过一个进程方法使对象生存,甚至不能生成数组类型.要实现这一点,您可能需要添加堆或实时垃圾收集器.管理一个堆并且堆栈朝向彼此增长是很困难的,并且实时GC也不是当前经典实现中存在的东西.我们在这里处理一个极其受限制的环境.

所以基本上你必须解决平台的限制.

使用的一个好策略是创建包含临时内存或引用现有内存(如APDU缓冲区内的内存)的对象缓存.将在安装或个性化期间创建对象.然后可以在必要时检索这些对象,使用它们并将其返回到缓存.为了给您一个想法,请查看Java的ByteBuffer.wrap()方法,该方法允许您对现有数组的一部分执行缓冲区操作.现在考虑该类型的可重用对象.

另一个逻辑解决方案是根本不使用OO编程.嘿,OO都很好,花花公子,但我们谈论的芯片的RAM最大为8到10 KiB.会有限制.可以通过方法完成对象所能做的事情(实际上,你可以证明这就是情况,因为没有对象的Java无疑是图灵完备的,但是如果你坚持使用你的设计那就没什么安慰了) .

你的文字说明:

>不,您不能将字节数组转换为对象实例.这将是Java和OO的所有原则.如果可能的话,包括数据封装在内的所有内容都将被破坏.您当然可以反序列化自己并将结果放在缓存中的对象中(参见上面的策略).>内存通常只应在安装或个性化期间分配,或者很可能在使用延迟实例化发布后分配一次.>您不需要100个活动对象.您只有一些对象需要在某个特定时间“活着”.利用这些信息!>内存分配特定于平台实现.肯定有平台具有较小的“集群”大小;平台通常会尝试在内存中对齐数据,因此它也取决于系统/芯片的设计.>使用CLEAR_ON_DESELECT创建的内存可供其他applet使用.如果选择它们,则不再需要此RAM.一个聪明的实现会将内存保留在堆上(仍然很棘手,但是嘿).如上所述,在选择实例后,这变得可用.只有在选择了applet之后才会调用process方法(即使是处理初始的SELECT APDU本身).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读