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節。