·为小型的,且资源有限,Connected Limited的设备定义一个标准的Java平台。
·允许动态的向这些设备发布内容与应用程序。
·方便第三方软件厂商与开发者向这些设备移植内容与应用程序。
CLDC的范围
·Java语言与虚拟机的特性
·核心Java类库(如java.lang.*, java.util.*)
·输入/输出
·对网络的支持
·对安全性的支持
·对国际化的支持
CLDC不包括的范围(即由MIDP解决的)
·对应用程序life-cycle的管理(就是指一个应用程序是如何安装,运行,删除的)
·UI界面(User Interface)
·Event处理
·高级应用程序模式(这里指用户与应用程序的交互)。
CLDC的安全性
低端的基于虚拟机的安全性由下载时对class文件的审核(verification)步骤来保证
。(如果你写过并编译过MIDlet程序,就会知道这一步是必须的。这里有一个概念就行了,
我会在以后讲述如何创建MIDlet程序时,详细介绍具体的步骤)。
基于应用程序的安全性通过使每个应用程序分别运行在相对独立的封闭环境中来保证
并且处于被保护的系统package中的类不能被应用程序重载(overridded)。
对于Java语言支持的特殊的方面
CLDC总的来说是与Java语言完全兼容的,但需注意以下几点:
不支持浮点数据类型(即没有float和double)(这实际上主要是由于CLDC所面向的设
备,其硬件因其内存限制或是基于安全性的考虑不支持浮点运算)
不支持类实例(class instance)的终结(finalization),即不存Object.finalize
()方法。(注:finalization指的是java中提供的有别与garbage collection的另外的一种
对象清理方法。具体可参看侯捷老师译的Bruce Eckel的《Thinking in Java 第二版》,可
以在www.jjhou.com中下载)
有限的错误处理,即大部分Java.lang.Error的子类都未被支持。与此相反,CLDC包括
了相当完备的异常(exception)类。
对于Java虚拟机(Java Virtual Machine)支持的特殊的方面
实质上CLDC在其严格的内存限制下达到了对Java虚拟机相当程度的兼容性。不过还是有
下列不同点。
·不支持浮点数据类型(没有float和double)
·不支持JNI (the Java Native Interface )
·不支持用户自定义的Java级的类载入器(class loaders )
·没有反射(reflection)特性(注:reflection指java通过java.lang.reflect提供
的,可以对类的能力进行分析的功能。常用来对类的结构进行检查,在JavaBeans上有广泛
运用可参见Gary Cornell的Core Java2 volumeI,II,机工有出中译本)
·不支持线程组(thread groups)或守护线程(daemon threads)
·不支持类实例(class instance)的终结(finalization)
·没有弱参考(weak references)(注:weak reference提供了一种解决指向已经被
garbage collector清除的对象的方法。在Java2中被介绍。具体请参考java.lang.ref API
文档,和sun网站上关于Reference Objects和Garbage Collection的文章。)
·有限的错误处理(error handling)
4。深入理解CLDC (part II)
本节的部分内容译自J2ME White Paper,比较枯燥,但请记住,毕竟,正确
的观念重于一切。
类文件审核过程(classfiles Verification)
CLDC要求其下层的虚拟机能够辨别并拒绝非法的class文件。但由于CLDC本身
面向小内存消耗的小型设备这一前提。其类文件检测机制与J2SE中定义的标准类
文件审核机制还有所不同。请注意看下图:
MyApp.java
│
↓
┌───┐
│Javac │┄编译器
└───┘
↓
MyApp.class
↓
┌──────┐
│preverifier │┈预审核器
└──────┘
↓
MyApp.class
│
↓download...
┌────────┒
│ ┠┄┄KVM运行环境
│┌──────┐┃ (目标设备)
││ verifier │┃
│└──────┘┃
│ ┃
│┌──────┐┃
││ │┃
││interpreter │┃
││ │┃
│└──────┘┃
┕━━━━━━━━┛
图2 CLDC/KVM中类文件的审核过程
请注意CLDC中的预审核(preverification)过程。这是CLDC区别于通常的类文件
审核过程的关键。如上图所示,当源程序被编译后,必须被预审核器预审核,然
后才能被下载到目标设备上去。之所以有这一步骤,主要是为了减轻KVM中审核器
的负担,加快审核速度。就像我前文提到的,这是出于对CLDC支持的硬件的考虑
(毕竟手机和PDA并没有我们PC机那样奔腾的“芯”呀!^-^)。这里记住这个概
念就行了。具体的操作方法我会在以后讲述编写MIDlet程序时介绍。
类文件格式
sun要求通过Jar(compressed Java Archive)给Java应用程序打包,这里也
不例外。所以如果你想把你的MIDlet程序下载到设备上运行,你就得先用jar打包
。具体的操作方法我会在以后讲述编写MIDlet程序时介绍。
CLDC的类库
如果不严格的说,CLDC的类库是J2SE的一个小的子集,有以下这种近似关系
成立,即J2SE包含CDC包含CLDC。但要注意CLDC并未完全包含于J2SE,它还包括一
些专门针对无线设施的类。所以可以把CLDC的类库简要划分为两部分:从J2SE继
承的类和CLDC专有的类。
(1)从J2SE继承的类
这部分包括三个package,即java.lang,java.util和java.io。注意即使这些从
J2SE继承的的类,也是大大“缩了水”的。例如java.util的类与接口由J2SE的
47个缩减到10个。另外两个也有相应缩减。
系统类
From java.lang:
Object, Class, Runtime, System, Thread, Runnable,
String, StringBuffer, Throwable
数据类型类
From java.lang:
Boolean, Byte, Short, Integer, Long, Character
容器类(container class)
From java.util:
Vector, Stack, Hashtable, Enumeration
I/O 类
From java.io:
InputStream, OutputStream, ByteArrayInputStream,
ByteArrayOutputStream, DataInput, DataOutput,
DataInputStream, DataOutputStream, Reader, Writer,
InputStreamReader, OutputStreamWriter, PrintStream
日期与时间类
From java.util:
Calendar, Date, TimeZone
附加的实用类
java.util.Random, java.lang.Math
异常类(Exception Classes)
From java.lang:
Exception, ClassNotFoundException,
IllegalAccessException, InstantiationException,
InterruptedException, RuntimeException,
ArithmeticException, ArrayStoreException,
ClassCastException, IllegalArgumentException,
IllegalThreadStateException, NumberFormatException,
IllegalMonitorStateException, IndexOutOfBoundsException,
ArrayIndexOutOfBoundsException,
StringIndexOutOfBoundsException,
NegativeArraySizeException, NullPointerException,
SecurityException
From java.util:
EmptyStackException, NoSuchElementException
From java.io:
EOFException, IOException, InterruptedException,
UnsupportedEncodingException, UTFDataFormatException
错误类
From java.lang:
Error, VirtualMachineError, OutOfMemoryError
(2)CLDC专有的类
这里sun提供了javax.microedition.io包。用它来提供与外界沟通的桥梁。
(注:就像在J2SE中我们利用java.net.*)注意,所有的连接都由javax.
microedition.Connector创建。例如:
你可以打开一个http连接通过
Connector.open("http://www.chinajavaworld.com")
javax.microedition.io的接口包括:
Connection, InputConnection, OutputConnection,
StreamConnection, ContentConnection, DatagramConnection,
StreamConnectionNotifier
这里再说明一点,实际上你也可以看出,CLDC所包括的类库,并不足以开发应用
程序。例如,没有UI界面的支持等。这也正是CLDC的设计理念。CLDC本身就从未
想过要解决所有的问题。这些问题要靠其上层的Profile-MIDP来解决。例如
javax.microedition.lcdui就是定义在MIDP中的UI包。