?前言:
相信在前几期RUN!PC上看过笔者文章的朋友们,对于Java在手持装置(如:Palm)或是行动装置(如:Motorola手机)上的应用应该有一定程度的熟悉了。可是正所谓「见山不是山,见水不是水」,虽然在笔者之前的文章中已经告诉大家如何在这些装置上撰写Java程序,不过,CLDC到底是什幺东西呢? MIDP又是啥玩意儿? 相信许多人脑袋里一定布满许多疑问。假如各位自行到Javasoft网站上查询有关Java 2 Micro Edition的资料,十之八九会被一大堆的技术名词搞的一头雾水。什幺KVM,什幺CLDC、CDC、MIDP,喔喔,后面还冒出了Personal Java、Embedded Java以及JES等名词。虽然是Java的微小版,可是它的世界可真是不小,足以令人眼花撩乱。
的确,笔者在刚开始接触Java 2 Micro Edition的时候,就感觉到这个玩意儿实在越看越让人摸不着头绪。即使大家都已经明白如何针对Java 2 Micro Edition撰写程序,但是笔者还是认为,对Java 2 Micro Edition有个巨观的了解一定会对大家有很大的助益。因此本文将反璞归真,带大家从巨观的角度来看待Java 2 Micro Edition的世界。希望看过本文之后,可以使大家再次体验「见山是山,见水是水」,一切豁然开朗的感觉。
首先,我们必须先明白Java 2 Micro Edition在整个Java技术之中的定位。
?各种Java版本的定位
使用Java撰写程序的人都知道,Java规格之中有一组所谓的核心类别(Core Class,即java.* ),在核心类别之外还有所谓的扩充类别(Extended Class,即javax.* )。根据对这两种类别的支持程度,进而区分出四种不同的Java版本,如下图所示:
上图所描述的只是各种不同Java版本所支持之核心类别的范围,并无法针对这些版本所支持的额外扩充类别座描述。另外,此图也说明了这些版本所支持的Java基本型别(primitive type,即boolean、byte、short、int、long、float、double这些型别)的范围。同心圆的越外面,所支持的核心类别就越完整。反之位于同心圆内部的Java版本,所支持的就只是核心类别的子集合,而且越往里面,所支持的核心类别子集合就越小。同样地,越在同心圆的外部,所支持的Java基本型别就越完整,而越在同心圆内部,所支持的Java基本型别就越少。
要理解这个图,我们必须以Java 2 Standard Edition(J2SE)作为基准,这个版本实做了所有Java标准规格之中所定义的核心类别,也支持所有的Java基本型别。J2SE定位在客户端程序的应用上。
从J2SE往外延伸,其外头的同心圆为Java 2 Enterprise Edition(J2EE),此版本除了支持所有的标准核心类别,而且还增加了许多支持企业内部使用的扩充类别,比方说支持Servlet / jsp的javax.servlet.* 类别、支持Enterprise Java Bean的javax.ejb.* 类别。当然J2EE必定支持所有的Java基本型别。J2EE定位在服务器端(server-side)程序的应用上。
从J2SE向内看,首先会看到Java 2 Micro Edition(J2ME),它所支持的只有核心类别的子集合,比方说J2ME CLDC的规格之中,只支持java.lang.*、java.io.*、以及java.util.*这些类别。此版本也增加了一些支持”微小装置”的扩充类别,如javax.microedition.io.*类别。然而,此版本并不支持所有的Java基本型别,就标准的J2ME CLDC之参考实做,也就是能在PalmOS上执行的KVM(K Virtual Machine)来说,它就不支持属于浮点数(float、double)的Java基本型别。J2ME定位在嵌入式系统的应用上。
同心圆的最里面,还有一个Java的Smart Card版本,这个部分原本在Java的文件之中并没有这样定义,但是以笔者对所有Java版本的了解,将它画在J2ME内部是很合理的。因为Smart Card版本只支持java.lang.*这个核心类别,比起J2ME所支持的核心类别更少,但它也有属于自己的扩充类别,如javacard.*、javacardx.*这些类别。Smart Card版本只支持boolean与byte这两种Java基本型别。就如同其名称,此版本定位在Smart Card的应用上。
在以上每一种Java版本之中,都有属于自己的虚拟机器(VM),藉以达成「Write once,run anywhere」的终极目标。在Smart Card上有Card VM,负责执行下载到Smart Card上的Card Applet;在J2ME的世界里,其标准参考实做?KVM,用来执行下载至嵌入式装置上的Spotlet或MIDlet;在J2SE与J2EE之中,有Classic VM与HotSpot VM负责执行Java Applet、Java Servlet或Java Application。
HotSpot VM是新一代的JVM,相较之下Classic VM则是传统的JVM。根据Javasoft的说法,HotSpot VM让Java程序的执行效率大幅提升。其实HotSpot VM还分成client版与server版。为何要区分成这两种呢? 其实主要是因为在客户端执行的应用程序与服务器上所执行的应用程序在基本需求上有所不同,客户端应用程序比较注重画面上的美观、使用者接口的灵敏度;而服务器上执行的应用程序则比较没有画面上的需求,因此HotSpot VM的两种版本就是为了针对不同的需求而分别予以最佳化而产生的结果。
其实以上所述的VM都只是Javasoft根据Java 虚拟机器规格的标准实做,实际上有许多家公司都有自己所开发出来的VM,而且也符合Java 虚拟机器规格,比方说IBM的J9 VM就是一个例子。所以大家千万别以为JVM只Sun一家,别无分号。