J2ME 程式設計/MIDlet 預驗證
外觀
一個MIDlet 是一個用於嵌入式裝置的Java 程式,更具體地說,是用於J2ME 虛擬機器。通常,這些是執行在手機上的遊戲和應用程式。
由於J2SE 中的類驗證佔用 50 KB,而MIDP 裝置的儲存空間有限,因此類驗證已分解為由開發人員完成的部分和由移動 JVM 本身完成的部分。由開發人員引導的類驗證階段稱為 MIDlet 預驗證,它發生在類編譯之後。
通常,預驗證任務用註釋標記類檔案,這些註釋由移動 VM 中的小型不完整類驗證器讀取並使用,以執行快速類驗證,從而使移動 VM 能夠執行生成的位元組碼。生成的位元組碼 是有效的位元組碼,因為註釋使用位元組碼的屬性來為移動 VM 生成註釋,以便它在執行最終不完整類驗證時進行讀取。[1]。
根據 Java 虛擬機器規範[2],類檔案驗證在 JVM 完全啟動之前完成,以執行應用程式的位元組碼。
- 前四個位元組中的魔數正確。
- 位元組碼屬性必須具有適當的長度。
- 類檔案不能被截斷或在末尾有額外的位元組。
- 常量池不得包含任何表面資料。
- 確保最終類不會被子類化,並且最終方法不會被重寫。
- 檢查除
Object之外的每個類是否都有一個直接超類。 - 確保常量池滿足記錄的靜態約束。
- 檢查常量池中所有欄位引用和方法引用是否具有有效的名稱、有效的類和有效的型別描述符。
在連結期間,驗證器透過執行資料流分析來檢查程式碼屬性的程式碼陣列,以確保以下專案為真:
- 運算元堆疊始終保持相同的大小幷包含相同型別的值。
- 除非已知區域性變數包含適當型別的值,否則不會訪問它。
- 方法使用適當的引數呼叫。
- 欄位僅使用適當型別的賦值。
- 所有操作碼 在運算元堆疊和區域性變數陣列中都有適當的型別引數。
這是類載入發生的步驟,以完成類驗證過程。
- 預驗證放置一個 StackMap 屬性,它是 Code 屬性的子屬性,它描述了使用的變數型別和運算元堆疊項。
- 內聯所有子例程並移除跳轉。[3]
- 預設情況下,它為 Java 程式碼生成一個類檔案。[4]
預驗證透過在 Code 屬性的 StackMap 部分插入描述使用的變數型別和運算元堆疊項的註釋來預驗證已編譯的類。這以及內聯所有子例程和移除跳轉,將 J2SE 驗證過程的前三個步驟簡化為更易於管理的步驟,從而在移動裝置中完成最後第四步,以在移動 JVM 內完成移動裝置的記憶體大小。
J2ME、Java 和所有基於 Java 的商標是ORACLE 在美國和其他國家/地區的商標或註冊商標。
- ↑ "什麼是預驗證?". 什麼是預驗證?為什麼我在沒有預驗證類檔案時從 CLDC/KVM 中收到錯誤訊息?.
- ↑ "VM Spec". Java 虛擬機器規範. ISBN 0201432943
- ↑ ("無處不在的服務" (PDF). 移動裝置上的無處不在的服務.
- ↑ "J2ME 教程,第一部分:建立 MIDlet?". 預設情況下,預驗證器將在當前目錄中的名為 output 的資料夾中建立預驗證版本的類檔案。它將保留包結構…….
- "什麼是預驗證?". 什麼是預驗證?當我未對我的類檔案進行預驗證時,為什麼我會收到來自 CLDC/KVM 的錯誤訊息?.
- "VM Spec". Java 虛擬機器規範.
- "無處不在的服務" (PDF). 移動裝置上的無處不在的服務.