您的位置:首页 > 运维架构 > Shell

J2ME in a Nutshell(翻译版) :第二章 连接有限设备配置CLDC,2.1.1虚拟机和语言特性

2005-09-23 15:23 573 查看
2.1.1 虚拟机和语言特性

CLDC规范通过描述完整java虚拟机的部分规范和不需要支持的java语言规范来定义其虚拟机必须有的特性。Sun公司提供了一个CLDC规范参考实现。该实现是基于一个满足CLDC需求的虚拟机KVM的。然而,支持CLDC的设备生产商不一定要基于KVM。任何拥有CLDC规范特性并且可以在受限环境中工作的虚拟机都可以使用。在本书中,我们提供KVM的特性参考,但是除非我明确说明,我所说的任何特性同样也适用于任何兼容的虚拟机。接下来的几节我们将介绍CLDC不支持的虚拟机和语言特性和不同于J2SE的行为。

2.1.1.1Floating point support

因为许多的CLDC平台没有浮点运算的硬件,虚拟机就不需要支持浮点数的操作。对于虚拟机来说,表2-1所示的字节码操作时没有实现的



这就带来了如下的编码限制:

ü float 和double变量以及这些变量的数组不能声明和使用

ü float和double类型的常量不能使用

ü 方法的参数不能是float和double类型

ü 对象Float 和Double也不能创建(事实上,这些类在CLDC也不存在—参照2.2节)

Sun没有特地为CLDC的应用提供java编译器,所以可以使用J2SE编译器来创建使用浮点数的类文件,那样就会违反上面的规则。然而,当装载到CLDC虚拟机进行严正的时候,这些类文件会被拒绝(参照2.1.2节有关类文件验证的讨论)。

2.1.1.2语言特性的缺失

除了浮点运算的限制,还有一些其他的java语言的特性在CLDC应用中不可使用

映射(reflection

java.lang.reflect包和与映射相关的java.lang.Class的所有特性都是不可用的。这个限制部分地适用于保存内存,但是它也节省了决定应用代码是否有权限来访问这些特性

弱参考(Weak references

因为需要存储来实现,弱参考和java.lang.ref包没有提供

对象结束(Object finalization)

相对于很小的作用来说,Object finalization使得虚拟机变得很复杂。所以,Object finalization没有实现并且CLDC类java.lang.Object没有finalize()方法

线程特性(Treading features

CLDC提供了线程,但是它不允许创建监听线程(当虚拟机的所有非监听线程结束后,这种线程自动终止)和线程组

错误和异常(Errors and exceptions

J2SE提供了大量的类来处理错误和异常境况。因为java应用通常不希望从错误中恢复(意味着抛出继承于java.lang.Error的异常),大多数的类没有被包含在CLDC平台。当这种错误发生时,设备应该采取合适的行为而不是报告错误代码,具体可以参照2.2节

java本地接口(Java Native Interface)

CLDC没有提供J2SE JNI特性,这允许java代码来调用本地代码。JNI被忽 略,部分是因为内存消耗,同时也是为了保护CLDC以免由于恶意代码带来的安全问题,详细可参照2.1.2节。

2.1.1.3类的装载

在J2SE平台,类的装载是通过类装载器来实现的,包括应用定义的类装载器来实现一个开放机制来定位和装载 Java类。相反,CLDC规范要求实现部可以被应用覆盖和继承的装载机制。这样做的原因就是防止因从不信任的地方来装载类而带来的安全问题。

CLDC规范表示任何虚拟机实现必须可以装载以JAR压缩形式的应用包。然而,它没有制定额外的不依赖设备的表示和访问应用代码的方法,也没有提供任何方法使得设备可以定位和获取代码。这些任务被扔给了不依赖设备的应用管理软件,它的特性不在规范的范围之内。Sun的CLDC参考实现包含了这种功能的一个样例实现,被称为java应用管理器(JAM).

设备可以把任何支持的扩展格式的应用转化为更适合和高效的内部格式。例如,针对PalmOS的MIDP产品,包含了CLDC的实现,接受了以JAR为格式的应用,就可以把它转化成 PalmOS支持的PRC格式,具体请参照9.2节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: