專利名稱::為應(yīng)用程序透明地加載只讀存儲(chǔ)器中的資源的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計(jì)算機(jī)系統(tǒng),更具體來說涉及為Java虛擬機(jī)上執(zhí)行的應(yīng)用程序透明地從只讀存儲(chǔ)器(“ROM”)加載資源(諸如所存儲(chǔ)的位圖、圖象、字體和聲音文件)的方法、系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品。Java是由太陽微系統(tǒng)公司開發(fā)的一種強(qiáng)健、可移植、面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,在編寫因特網(wǎng)和萬維網(wǎng)(以下簡(jiǎn)稱WEB)程序的方面正在獲得廣泛的接受。大多數(shù)程序設(shè)計(jì)語言的編譯程序生成適用于特定操作環(huán)境的代碼,而Java則使得用“一次寫成,處處運(yùn)行”(WriteOnce,RunAnywhere)的范例編寫程序成為可能。(“Java”和“WriteOnce,RunAnywhere”是太陽微系統(tǒng)公司的商標(biāo)。)Java是通過使用專門設(shè)計(jì)的虛擬機(jī)(“VM”)而得到其可移植性的。這個(gè)虛擬機(jī)也稱作“Java虛擬機(jī)”或“JVM”。虛擬機(jī)使?jié)撛谟布募?xì)節(jié)與用于編譯Java程序設(shè)計(jì)指令的編譯程序得以分離。這些細(xì)節(jié)是通過虛擬機(jī)的實(shí)現(xiàn)而提供的,包括諸如在運(yùn)行Java程序的機(jī)器上使用的是小Endian還是大Endian格式等等。因?yàn)檫@些從屬于機(jī)器的細(xì)節(jié)不在編譯代碼中反映,所以能將代碼移植到不同的環(huán)境(不同的硬件機(jī)器、不同的操作系統(tǒng),等等),并在該環(huán)境中執(zhí)行代碼,而不要求改編或重新編譯代碼-所以就有了“一次寫成,處處運(yùn)行”這個(gè)說法。被稱為Java“字節(jié)碼”的編譯代碼然后在JVM的頂上運(yùn)行一其中JVM是按具體的操作環(huán)境改編的。這種具體改編JVM的例子是,由于字節(jié)碼是按規(guī)范格式(大Endian)生成的,如果JVM在是小Endian的機(jī)器上運(yùn)行,JVM就要負(fù)責(zé)先將指令從字節(jié)碼轉(zhuǎn)換,再將它們傳送給微處理器。Java運(yùn)行環(huán)境包括JVM以及運(yùn)行Java應(yīng)用程序或小應(yīng)用程序所需要的若干文件和類。自此,除非另外注明,術(shù)語“JVM”和“運(yùn)行環(huán)境”將互可交換地在本文中使用。Java應(yīng)用程序通常是從諸如太陽微系統(tǒng)公司的“JDK”(Java開發(fā)工具箱)產(chǎn)品的開發(fā)工具包、或用也是出自太陽微系統(tǒng)公司的“JRE”(Java運(yùn)行環(huán)境)產(chǎn)品被執(zhí)行的。JRE是JDK的子集,提供應(yīng)用程序執(zhí)行所需的功能。當(dāng)采用JRE時(shí),程序是從命令行執(zhí)行的。被稱為“類加載程序”的Java類在Java環(huán)境中用來動(dòng)態(tài)地加載運(yùn)行程序中的類和資源。圖1表示使用JVM和類加載程序的類加載的現(xiàn)有水平技術(shù)。JVM的類加載程序功能使Java應(yīng)用程序能隨著程序的執(zhí)行而遞增地加載。本領(lǐng)域中眾所周知,程序員編寫Java程序后,將其編譯成Java字節(jié)碼。含有Java字節(jié)碼的文件被稱為“類文件”。程序員100然后將類文件裝入類文件的儲(chǔ)存庫110或111。在以后的某個(gè)時(shí)刻,應(yīng)用程序150在客戶計(jì)算機(jī)160上被JVM140執(zhí)行。當(dāng)應(yīng)用程序150試圖使用某個(gè)在客戶計(jì)算機(jī)160上尚未調(diào)入的類時(shí),JVM140的類加載程序部件130會(huì)向類服務(wù)器120發(fā)出請(qǐng)求102a。(類服務(wù)器功能120通常包含在標(biāo)準(zhǔn)Web服務(wù)器內(nèi)。)這個(gè)請(qǐng)求102a通知類服務(wù)器120從儲(chǔ)存庫110提取(103a、104a)該類文件,并將其返回給(105a)JVM140。或者,類加載程序130也可以在本機(jī)文件系統(tǒng)111的目錄中查找所需要的類。在這種情況下,要從文件系統(tǒng)111請(qǐng)求(102b)所需的類并將其返回給(105b)給JVM140。不管文件是從位置110還是111中檢索出來的,應(yīng)用程序150然后都要用檢索出的類文件繼續(xù)執(zhí)行。這種對(duì)類文件的動(dòng)態(tài)加載,操作上對(duì)應(yīng)用程序150的用戶是透明的。Java類加載程序在查找文件時(shí)采用預(yù)定的檢索策略,對(duì)特定位置予以優(yōu)先考慮。按照J(rèn)ava1.2平臺(tái)規(guī)范,最高優(yōu)先級(jí)的檢索位置是自引導(dǎo)的運(yùn)行和國(guó)際化類,分別稱為“rt.jar”和“i18n.jar”。如果在這些位置找不到所需的類,次高優(yōu)先級(jí)要在安裝的擴(kuò)展類中查找一擴(kuò)展類是在JRE的“l(fā)ib/ext”目錄中存儲(chǔ)的JAR中的類。(“JAR”指“Java檔案庫”,是用于對(duì)應(yīng)用程序所用文件進(jìn)行分布和存檔的一種文件格式。)最后,如果還沒有找到該類,就要考慮類路徑系統(tǒng)的屬性設(shè)置。由類路徑規(guī)定的任何路徑,以及在用這些路徑找到的JAR文件的清單的類路徑屬性中標(biāo)識(shí)的任何路徑,都可以用來檢索所需的類。(欲知詳細(xì)信息,可在網(wǎng)上參看“認(rèn)識(shí)擴(kuò)展類加載”(UnderstandingExtentsionClassLoading)一文,網(wǎng)址為。)此外,可以通過(用目錄和文件名標(biāo)識(shí))指定類文件在文件系統(tǒng)中的位置從已知位置來加載類文件,或者通過指定類文件的統(tǒng)一資源定位器(URL)從網(wǎng)絡(luò)服務(wù)器上的位置來加載類文件?,F(xiàn)有技術(shù)的動(dòng)態(tài)加載方法也用于對(duì)Java應(yīng)用程序所用資源文件的檢索和加載。資源可能已經(jīng)單獨(dú)地存儲(chǔ)在存儲(chǔ)可執(zhí)行類文件的同一個(gè)目錄中;它們可能被包裝在包裝類文件的同一個(gè)JAR文件中;或者,它們可以與類文件一起存儲(chǔ)在公用的目錄結(jié)構(gòu)中,但被收集到單獨(dú)的子目錄(諸如“圖象”或“資源”子目錄)中?,F(xiàn)有的類加載程序功能假設(shè)存在文件系統(tǒng),并且CLASSPATH環(huán)境變量或“java.class.path”系統(tǒng)屬性將確定在該文件系統(tǒng)中類加載程序能動(dòng)態(tài)檢索所需類文件和資源的某個(gè)位置。然而,人們正在開發(fā)大量為方便移動(dòng)或便攜使用的新型計(jì)算設(shè)備。這些設(shè)備要設(shè)計(jì)得重量輕、體積小、效率高(從費(fèi)用角度和操作角度而言),所以許多設(shè)備都被設(shè)計(jì)得沒有磁盤驅(qū)動(dòng)器的系統(tǒng)開銷,沒有用來存取磁盤文件的文件系統(tǒng)軟件。(此外,這些設(shè)備經(jīng)常被配置以相對(duì)較小的存儲(chǔ)器,容量數(shù)量級(jí)在幾兆字節(jié)。)本文自此將這些設(shè)備稱為“嵌入設(shè)備”,它們的例子包括個(gè)人數(shù)字助理(PDA);蜂窩電話和可視電話(screenphones)、尋呼機(jī)以及便攜式(wearable)計(jì)算設(shè)備。這些嵌入設(shè)備如果沒有磁盤驅(qū)動(dòng)存儲(chǔ)器,可以將資源文件存儲(chǔ)在只讀存儲(chǔ)器中。然而如前文所述,現(xiàn)有的Java類加載程序機(jī)構(gòu)優(yōu)先檢索在文件系統(tǒng)中存儲(chǔ)的文件。由于嵌入設(shè)備沒有文件系統(tǒng),所以要為嵌入設(shè)備提供一種可替代的技術(shù)。這個(gè)技術(shù)必須能高效地查找出在嵌入設(shè)備上執(zhí)行的應(yīng)用程序所需要的資源。在名稱為“訪問ROM中存儲(chǔ)的資源文件”(AccesstoResourceFilesStoredinROM)的待審定美國(guó)專利申請(qǐng)(序列號(hào)09/___,受讓給本發(fā)明的同一個(gè)受讓人,本文引用作為參考)中,描述了一種技術(shù)。然而,該技術(shù)要求修改現(xiàn)有應(yīng)用程序代碼來專門檢索ROM存儲(chǔ)器中的資源。盡管這種方法在特定情況中是有益的,但如果換一種方法能避免修改應(yīng)用程序代碼則會(huì)更好。修改應(yīng)用程序代碼是人們不希望做的事情,這是因?yàn)樗袑?dǎo)入錯(cuò)誤的可能,需要進(jìn)行額外的測(cè)試來驗(yàn)證改編后的代碼,也因?yàn)槌砂偕锨У膽?yīng)用程序可能已經(jīng)廣泛地散布到千千萬萬的用戶手中,使應(yīng)用程序修改成為難以控制的任務(wù)。因此,需要一種技術(shù),現(xiàn)有應(yīng)用程序用它能透明地(不加改動(dòng)地)訪問已經(jīng)在ROM中存儲(chǔ)的資源。這種技術(shù)應(yīng)當(dāng)是后向兼容的,使得在具有文件系統(tǒng)的現(xiàn)有計(jì)算環(huán)境中執(zhí)行的程序不受影響。本發(fā)明的一個(gè)目的是提供一種現(xiàn)有應(yīng)用程序代碼能通過其透明地加載ROM中存儲(chǔ)的資源的技術(shù)。本發(fā)明的另一個(gè)目的是通過一種可替代的類加載機(jī)制來提供這種技術(shù)。本發(fā)明的另一個(gè)目的是以與資源不在ROM中存儲(chǔ)的現(xiàn)有計(jì)算環(huán)境后向兼容的方式來提供這種技術(shù)。本發(fā)明的另一個(gè)目的是以不要求用戶行動(dòng)或不要求用戶意識(shí)到該可替代的加載機(jī)制或策略的方式來提供這種技術(shù)。本發(fā)明的其它目的和優(yōu)點(diǎn),部分將在本說明和以下的各附圖中陳述,部分將通過本說明闡明或者通過對(duì)本發(fā)明的實(shí)踐得到了解。為了實(shí)現(xiàn)以上目的,按照本文廣義地說明的本發(fā)明的目的,本發(fā)明提供一種用于在計(jì)算環(huán)境中從ROM存儲(chǔ)器透明地加載資源的方法、系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品。這個(gè)技術(shù)包含在ROM中存儲(chǔ)多個(gè)資源文件;在計(jì)算機(jī)上執(zhí)行Java虛擬機(jī)(“JVM”);在JVM上執(zhí)行應(yīng)用程序;在JVM上執(zhí)行ROM類加載程序-ROM類加載程序要適合從ROM加載資源文件;創(chuàng)建包含對(duì)應(yīng)每個(gè)資源文件的項(xiàng)的表;由ROM類加載程序接收應(yīng)用程序?qū)x定的一個(gè)資源文件上的輸入流的請(qǐng)求;利用表定位ROM中所選擇的資源文件;利用查找到的資源返回該輸入流。表中的每項(xiàng)最好包含與特定一個(gè)資源文件的標(biāo)識(shí)符對(duì)應(yīng)的鍵值;該特定資源文件在ROM中的位置;在該特定資源文件的位置存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度。對(duì)表的使用最好還包含用該特定資源文件的標(biāo)識(shí)符作為鍵值來訪問表;訪問表時(shí)如果發(fā)現(xiàn)匹配的項(xiàng)就返回該特定資源文件的位置和長(zhǎng)度。這個(gè)技術(shù)最好進(jìn)一步包含將JVM配置得能使用ROM類加載程序。此外,該請(qǐng)求最好原封不動(dòng)地保留最好是在應(yīng)用程序中規(guī)定的預(yù)先存在的語義?,F(xiàn)在將結(jié)合以下附圖來說明本發(fā)明。各附圖中相同的標(biāo)注號(hào)自始至終表示同一個(gè)部件。圖1表示現(xiàn)有技術(shù)水平用Java虛擬機(jī)進(jìn)行類加載的技術(shù);圖2是可以在其中實(shí)踐本發(fā)明的計(jì)算機(jī)工作站環(huán)境的框圖3是可以在其中實(shí)踐本發(fā)明的連網(wǎng)的計(jì)算環(huán)境的框圖;圖4至6表示的流程圖敘述的是實(shí)現(xiàn)本發(fā)明最佳實(shí)施例時(shí)使用的邏輯。圖7至9表示的是可用來實(shí)現(xiàn)本發(fā)明最佳實(shí)施例的Java程序設(shè)計(jì)語言樣本。圖2表示一個(gè)可以在其中實(shí)踐本發(fā)明的代表性的工作站硬件環(huán)境。圖2的環(huán)境包含一個(gè)代表性的、包括有關(guān)外圍設(shè)備在內(nèi)的用戶計(jì)算機(jī)工作站210-例如個(gè)人電腦。工作站210包括微處理器212和總線214,后者用于按已知技術(shù)連接微處理器212與工作站210的部件并使它們之間能進(jìn)行通信。工作站210通常包括用戶接口適配器216,它將微處理器212通過總線連接到一個(gè)或多個(gè)接口設(shè)備,諸如鍵盤218、鼠標(biāo)器220和/或其它接口設(shè)備222-后者可以是任何用戶接口設(shè)備,諸如觸摸屏、數(shù)字輸入鍵盤、等等。總線214也將顯示器224(諸如LCD屏幕或監(jiān)視器)通過顯示適配器226與微處理器212相連。總線214還將微處理器212連接到存儲(chǔ)器228和長(zhǎng)期存儲(chǔ)器230,后者可包括硬盤驅(qū)動(dòng)器、軟盤驅(qū)動(dòng)器、磁帶驅(qū)動(dòng)器,等等。工作站210例如可以通過某個(gè)通信頻道或調(diào)制解調(diào)器232與其它計(jì)算機(jī)或計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行通信。工作站210或者也可以用232表示的無線接口-諸如CDPD(蜂窩數(shù)字包數(shù)據(jù))-進(jìn)行通信。工作站210可以與局域網(wǎng)(LAN)或?qū)捰蚓W(wǎng)(WAN)中的其它計(jì)算機(jī)聯(lián)系在一起,工作站210或者也可以是在與另一個(gè)計(jì)算機(jī)的客戶機(jī)/服務(wù)器組合中的客戶機(jī),等等。所有這些配置以及適當(dāng)?shù)耐ㄐ庞布蛙浖?,都是本領(lǐng)域中已知的。圖3表示可以在其中實(shí)踐本發(fā)明的數(shù)據(jù)處理網(wǎng)絡(luò)240。數(shù)據(jù)處理網(wǎng)絡(luò)240可以包括若干個(gè)別的網(wǎng)絡(luò),諸如無線網(wǎng)絡(luò)242和網(wǎng)絡(luò)244,它們每個(gè)都包含若干個(gè)別的工作站210。此外,本領(lǐng)域的熟練人員知道,可以包含一個(gè)或多個(gè)LAN(未予示出),其中,LAN可以包含若干與宿主處理機(jī)相連的智能工作站。繼續(xù)參看圖3,網(wǎng)絡(luò)242和網(wǎng)絡(luò)244也可以包括主計(jì)算機(jī)或服務(wù)器,諸如網(wǎng)關(guān)計(jì)算機(jī)(gatewaycomputer)246或應(yīng)用服務(wù)器247(它可以訪問數(shù)據(jù)儲(chǔ)存庫248)。網(wǎng)關(guān)計(jì)算機(jī)246起著進(jìn)入每個(gè)網(wǎng)絡(luò)244的入口點(diǎn)的作用。網(wǎng)關(guān)246最好通過通信鏈路250a與另一個(gè)網(wǎng)絡(luò)242相連。網(wǎng)關(guān)也可以用通信鏈路250b、250c直接連接到一個(gè)或多個(gè)工作站210。網(wǎng)關(guān)計(jì)算機(jī)246可以用IBM公司的企業(yè)系統(tǒng)體系結(jié)構(gòu)/370(EnterpriseSystemsArchitecture/370)、企業(yè)系統(tǒng)體系結(jié)構(gòu)/390(EnterpriseSystemsArchitecture/390)計(jì)算機(jī)等來實(shí)現(xiàn)。視具體應(yīng)用而定,可以采用中等的計(jì)算機(jī),諸如應(yīng)用系統(tǒng)/400(ApplicationSystem/400)(也叫AS/400)。(EnterpriseSystemsArchitecture/370是IBM的商標(biāo),EnterpriseSystemsArchitecture/390、ApplicationSystem/400和AS/400是IBM的注冊(cè)商標(biāo)。)網(wǎng)關(guān)計(jì)算機(jī)246也可以連接249到存儲(chǔ)器(諸如數(shù)據(jù)儲(chǔ)存庫248)。此外,網(wǎng)關(guān)246可以直接或間接地連接到一個(gè)或多個(gè)工作站210。本領(lǐng)域的熟練人員將知道,網(wǎng)關(guān)計(jì)算機(jī)246可以位于地理位置遠(yuǎn)離網(wǎng)絡(luò)242的地方,類似地,工作站210可以位于與網(wǎng)絡(luò)242和244有相當(dāng)距離的位置。例如,網(wǎng)絡(luò)242可以位于美國(guó)加州,而網(wǎng)關(guān)246可以位于德克薩斯,一個(gè)或多個(gè)工作站可以位于紐約。工作站210可以用諸如傳輸控制協(xié)議/網(wǎng)際協(xié)議(TCP/IP)的連網(wǎng)協(xié)議,經(jīng)過若干可選擇的連接媒介(諸如蜂窩電話、無線電頻率網(wǎng)絡(luò)、衛(wèi)星網(wǎng)絡(luò)等等),與無線網(wǎng)絡(luò)242連接。無線網(wǎng)絡(luò)242最好用諸如TCP或UDP(用戶數(shù)據(jù)報(bào)協(xié)議)的網(wǎng)絡(luò)連接250a,經(jīng)過IP、X.25、幀中繼、ISDN(綜合業(yè)務(wù)數(shù)字網(wǎng))、PSTN(公共交換電話網(wǎng))等,與網(wǎng)關(guān)246連接。工作站210也可以選擇用撥號(hào)連接250b或250c直接連接到網(wǎng)關(guān)246。此外,無線網(wǎng)絡(luò)242和網(wǎng)絡(luò)244可以以圖3中所示的類似的方式連接到一個(gè)或多個(gè)網(wǎng)絡(luò)(未予示出)。體現(xiàn)本發(fā)明的軟件程序代碼,一般是由工作站210的微處理器212從某種類型的長(zhǎng)期存儲(chǔ)介質(zhì)(諸如CD-ROM或硬盤驅(qū)動(dòng)器)中訪問的。軟件應(yīng)用程序可以收錄在已知各種用于數(shù)據(jù)處理系統(tǒng)的媒體的任何一種上(諸如軟盤,硬盤驅(qū)動(dòng)器或CD-ROM)。代碼可以在這類媒體上傳播,或者可以經(jīng)過某種類型的網(wǎng)絡(luò)從一個(gè)計(jì)算機(jī)系統(tǒng)的內(nèi)存或外存?zhèn)鞑サ狡渌?jì)算機(jī)系統(tǒng),供這些其它系統(tǒng)的用戶使用?;蛘?,程序代碼也可以在包含在存儲(chǔ)器228上,由微處理器212用總線214來訪問。在存儲(chǔ)器中、物理媒體上收錄軟件程序代碼和/或通過網(wǎng)絡(luò)傳播軟件代碼的技術(shù)和方法是眾所周知的,本文將不作更深的討論。本發(fā)明可以在不與網(wǎng)絡(luò)連接的、以獨(dú)立方式運(yùn)行的用戶工作站上使用。或者,本發(fā)明可以在與網(wǎng)絡(luò)相連的用戶工作站上使用。當(dāng)本發(fā)明用在客戶機(jī)-服務(wù)器連網(wǎng)環(huán)境中時(shí),本發(fā)明運(yùn)行所在的客戶計(jì)算機(jī)可以用導(dǎo)線連接或無線連接與服務(wù)器相連。有線連接是采用諸如電纜和電話線的物理媒體的連接;而無線連接采用的媒體諸如是無線鏈路、無線電頻率波和紅外波。許多連接技術(shù)都可以用于這些各種媒體,例如用計(jì)算機(jī)的調(diào)制解調(diào)器經(jīng)過電話線建立連接;用LAN卡,諸如令牌環(huán)或以太網(wǎng);用蜂窩式調(diào)制解調(diào)器建立無線連接;等等??蛻粲?jì)算機(jī)可以是具有處理功能的(也可以有通信功能的)任何類型的計(jì)算機(jī)處理機(jī),包括膝上型、手提式或移動(dòng)式計(jì)算機(jī);車載設(shè)備;桌面計(jì)算機(jī);大型機(jī);等等。類似地,遠(yuǎn)程服務(wù)器可以是具有處理和通信功能的眾多不同類型的計(jì)算機(jī)中的任何一種。這些技術(shù)在本領(lǐng)域是眾所周知的,硬件設(shè)備和能使硬件有用的軟件很容易獲得。自此,將在相同的意義上把客戶計(jì)算機(jī)稱為“工作站”、“機(jī)器”、“設(shè)備”或計(jì)算機(jī),任何這些術(shù)語或術(shù)語“服務(wù)器”都是指上述的任何類型的計(jì)算設(shè)備。在最佳實(shí)施例中,本發(fā)明是以計(jì)算機(jī)軟件程序(或程序)的一個(gè)或多個(gè)模塊(也稱為代碼子例程,或者,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中稱為“對(duì)象”)實(shí)現(xiàn)的。這個(gè)實(shí)現(xiàn)通常將駐留在嵌入設(shè)備上并在嵌入設(shè)備上執(zhí)行?;蛘?,它也可以在諸如沒有磁盤存儲(chǔ)器和文件系統(tǒng)的桌面計(jì)算機(jī)的客戶工作站上運(yùn)行,而不會(huì)對(duì)程序在這個(gè)環(huán)境中的運(yùn)行產(chǎn)生不利的影響。本發(fā)明可以用于因特網(wǎng)環(huán)境中的工作站?;蛘?,環(huán)境也可以是公司內(nèi)部網(wǎng)、外部網(wǎng)(extranet)或任何其它網(wǎng)絡(luò)環(huán)境?;蛘?,本發(fā)明可以在獨(dú)立的環(huán)境中使用。在連網(wǎng)的環(huán)境中使用時(shí),本發(fā)明的代碼在客戶機(jī)設(shè)備上運(yùn)行。最佳實(shí)施例的程序代碼最好以Java面向?qū)ο蟪绦蛟O(shè)計(jì)語言中的對(duì)象來實(shí)現(xiàn)?;蛘?,本發(fā)明也可以與在Java虛擬機(jī)上執(zhí)行的、以任何程序設(shè)計(jì)語言(諸如Javascript或NetRexx)編寫的程序代碼一起使用。(Javascript是太陽微系統(tǒng)s公司的商標(biāo),NetRexx是IBM公司的商標(biāo)。)本發(fā)明也可以用于具有語義與本文所描述的Java類加載程序的語義類似的動(dòng)態(tài)部件加載機(jī)制的其它環(huán)境。最佳實(shí)施例提供的透明地從ROM加載資源的方法,要使用本文定義的一下文將結(jié)合圖4-9作更詳細(xì)討論的-一組部件,以后將會(huì)說明,它們是一起工作的。這些部件是(1)在本文中稱為“OSMemory”的對(duì)象類,它使應(yīng)用程序代碼能訪問ROM存儲(chǔ)器;(2)在本文中稱為“OSMemoryInputStream”的對(duì)象類,它是java.io.InputStream類的子類,為OSMemory對(duì)象提供流接口;(3)在本文中稱為“RomLoadingClassLoader”的對(duì)象類,它是一個(gè)新穎的Java類加載程序,知道如何從ROM向外加載資源。如前文結(jié)合圖1所述,類加載程序在Java應(yīng)用中,用來在執(zhí)行的應(yīng)用程序需要類或資源時(shí),動(dòng)態(tài)地加載類和資源;當(dāng)程序請(qǐng)求資源或調(diào)用類時(shí),正是ClassLoader去尋找并返回該資源或類。在現(xiàn)有技術(shù)的應(yīng)用程序代碼中,訪問資源通常要針對(duì)某個(gè)類調(diào)用Class.getResouceAsStream()過程。這個(gè)過程將資源的名稱作為參數(shù)。Class.getResouceAsStream()過程以調(diào)用ClassLoader.getResouceAsStream()過程而結(jié)束。每個(gè)類都有一個(gè)與其相關(guān)聯(lián)的ClassLoader對(duì)象。各種getResouceAsStream()過程返回一個(gè)InputStream類型的對(duì)象。這個(gè)InputStream對(duì)象是應(yīng)用程序代碼用來讀資源數(shù)據(jù)的標(biāo)準(zhǔn)接口。在這種現(xiàn)有技術(shù)的從應(yīng)用程序代碼加載資源方法(如前文結(jié)合圖1的系統(tǒng)體系結(jié)構(gòu)所述)中使用的過程調(diào)用一般如下所列-以名為“picture.gif”的資源被請(qǐng)求時(shí)為例(1)應(yīng)用程序調(diào)用getClass.getResourceAsStream(“picture.gif”)。(2)Class.getResourceAsStream()確定定義該類所在的包名,將該包名置于所請(qǐng)求資源名稱的前面,并(假設(shè)包名是“package_name”)調(diào)用getClassLoader.getResourceAsStream(“package-name/picture.gif”)。(3)ClassLoader.getResourceAsStream(“package-name/picture.gif”)尋找文件系統(tǒng)中以文件形式存在的、或是JAR文件中以文件形式存在的、或是在網(wǎng)絡(luò)服務(wù)器上存在的該“picture.gif”資源,并返回一個(gè)應(yīng)用程序能用來讀取該資源文件中數(shù)據(jù)的InputStream對(duì)象。如上所述,本發(fā)明定義一個(gè)新穎的類加載程序一本文稱之為對(duì)象“RomLoadingClassLoader”。RomLoadingClassLoader是從ROM加載的所有類的類加載程序。這個(gè)類加載程序的這個(gè)實(shí)現(xiàn),用一個(gè)資源名表來確定所請(qǐng)求的資源位于存儲(chǔ)器中的什么位置。按照最佳實(shí)施例,資源將與類一起被封裝(packaged),作為映象(image)裝入ROM中。進(jìn)行封裝所用的技術(shù)不是本發(fā)明的組成部分。這樣來同時(shí)定位(co-locating)類和資源,使特定類和其所需資源的安裝和拆卸變得更加容易。一旦資源被封裝在一起后,就對(duì)照該封裝映象運(yùn)行一個(gè)實(shí)用程序(它不是本發(fā)明組成部分)。這個(gè)實(shí)用程序確定在該映象中含有的資源的名稱或標(biāo)識(shí)符(它們將是一個(gè)串值)、所存儲(chǔ)資源在映象內(nèi)的起點(diǎn)、資源的存儲(chǔ)數(shù)據(jù)的長(zhǎng)度。根據(jù)這個(gè)信息,實(shí)用程序構(gòu)造一個(gè)用于訪問該被存儲(chǔ)資源的表,其中,表(或者其它存儲(chǔ)機(jī)構(gòu),諸如陣列)中的每項(xiàng)包含一個(gè)設(shè)置成該串標(biāo)識(shí)符的鍵值,以及一個(gè)最好包含-(1)指向資源位置的指針和(2)資源長(zhǎng)度-的值。可以用來以所述方式封裝資源、創(chuàng)建標(biāo)識(shí)資源的表的商業(yè)產(chǎn)品,是與IBMVisualAge_forEmbededSystems一起提供的jxeLink工具一這是出自IBM公司的JavaTMTechnologyEdition產(chǎn)品。對(duì)本領(lǐng)域的熟練人員來說,顯然,這種訪問表技術(shù)在資源尚未被封裝在一起時(shí)也是可以使用的。在這種情況下,要求知道被存儲(chǔ)的資源的標(biāo)識(shí)符、位置和長(zhǎng)度值。然后就能用該信息來構(gòu)造表。當(dāng)getResourceAsStream()的調(diào)用請(qǐng)求某資源時(shí),romLoadingClassLoader在該表中檢查ROM中當(dāng)前可用的資源。如果它發(fā)現(xiàn)對(duì)應(yīng)該被請(qǐng)求資源的項(xiàng),就創(chuàng)建一個(gè)OSMemoryInputStream類型的對(duì)象。這個(gè)對(duì)象是InputStream的子類,所以可以安全地被返回給應(yīng)用程序代碼。這個(gè)類的實(shí)現(xiàn)能在ROM存儲(chǔ)器之上使用InputStream的性能。所以,期望從輸入流讀取資源的現(xiàn)有程序,無論是在資源位于文件系統(tǒng)中的桌面計(jì)算機(jī)上執(zhí)行的,還是在資源位于ROM中的嵌入設(shè)備上執(zhí)行的,其運(yùn)行都是透明的。本發(fā)明的最佳實(shí)施例用以下過程調(diào)用(假設(shè)被請(qǐng)求資源是與前面例子中所用的相同的“picture.gif”)從應(yīng)用程序代碼加載資源(1)應(yīng)用程序調(diào)用getClass.getResourceAsStream(“picture.gif”)。這個(gè)調(diào)用原封不動(dòng)地出自現(xiàn)有技術(shù),所以現(xiàn)有應(yīng)用程序?qū)⒗^續(xù)工作,而不要求修改它們現(xiàn)有的調(diào)用語義。(2)Class.getResourceAsStream()確定定義該類所在的包名,將該包名置于所請(qǐng)求資源名稱的前面,然后調(diào)用RomLoadingClassLoader.getResourceAsStream(“package-name/picture.gif”)。此時(shí),被調(diào)用的是本發(fā)明的新穎的類加載程序,而不是現(xiàn)有技術(shù)的類加載程序。(3)RomLoadingClassLoader.getResourceAsStream()利用資源表尋找該對(duì)象在ROM中的位置。它構(gòu)造一個(gè)OSMemory對(duì)象,該對(duì)象最好明確(1)指向該對(duì)象位置的指針,(2)在該位置存儲(chǔ)的資源數(shù)據(jù)的長(zhǎng)度。過程然后為這個(gè)OSMemory對(duì)象創(chuàng)建一個(gè)OSMemoryInputStream對(duì)象。由于這個(gè)對(duì)象符合應(yīng)用程序期望的InputStream協(xié)議,所以應(yīng)用程序就像是在文件系統(tǒng)中存儲(chǔ)的文件中讀取該數(shù)據(jù)?,F(xiàn)在將結(jié)合圖4至9更詳細(xì)地討論本發(fā)明的最佳實(shí)施例。圖4至6表示是本發(fā)明最佳實(shí)施例使用的邏輯的流程圖。圖7至9表示的是可用來實(shí)現(xiàn)本發(fā)明最佳實(shí)施例的Java程序設(shè)計(jì)語言的類和過程的樣本。按照本發(fā)明,需要建立計(jì)算機(jī)系統(tǒng)來從ROM加載類和資源,但這種工作無需改動(dòng)應(yīng)用程序代碼。所需要的是對(duì)JVM確定新的類加載程序romLoadingClassLoader,供其啟動(dòng)時(shí)使用。所以,并不是需要改動(dòng)現(xiàn)有應(yīng)用程序代碼才能運(yùn)行本發(fā)明。規(guī)定作為JVM一個(gè)選項(xiàng)的類加載程序的技術(shù)是現(xiàn)有技術(shù)水平已知的,是特定于系統(tǒng)的;所以,本文將不詳細(xì)說明這些技術(shù)。許多嵌入設(shè)備都用Java代碼來支持它們的用戶界面。這種設(shè)備因而將在設(shè)備通電時(shí)啟動(dòng)JVM。否則,JVM就將在在JVM上運(yùn)行的應(yīng)用程序被執(zhí)行時(shí)啟動(dòng)。JVM的啟動(dòng)方式并不是本發(fā)明達(dá)組成部分。圖4表示在romLoadingClassLoader執(zhí)行時(shí)發(fā)生的初始化過程。對(duì)應(yīng)這個(gè)過程的程序設(shè)計(jì)語言語句,在圖7中表示,表現(xiàn)形式是包700中類705的過程710、715。向過程RomLoadingClassLoader710發(fā)送一個(gè)消息,將指針711傳送給資源表400。過程710的調(diào)用對(duì)應(yīng)于圖4的方框410。這個(gè)過程710調(diào)用過程initializeResTable715-如712處所示,也傳送資源表指針。過程715的調(diào)用對(duì)應(yīng)于方框420。如前文所述,資源表400含有一些數(shù)量的項(xiàng)405、406、407、408等等,它們每個(gè)有一個(gè)鍵值401、一個(gè)指針402和一個(gè)長(zhǎng)度值403。過程715根據(jù)資源表400創(chuàng)建散列表430。按照最佳實(shí)施例,項(xiàng)435、436、437、438等每個(gè)包含(1)來自對(duì)應(yīng)資源表項(xiàng)的相同鍵值431和(2)OSMemory對(duì)象432。每個(gè)OSMemory對(duì)象432包含來自對(duì)應(yīng)資源表項(xiàng)的的指針和長(zhǎng)度值(如圖8中OSMemory類805的元素806、807處所定義的那樣)。過程715所創(chuàng)建的hashTable對(duì)象在圖7中被稱為“resTable”-如元素706處所指示的那樣。創(chuàng)建散列表的技術(shù)在本領(lǐng)域中是已知的,可以使用標(biāo)準(zhǔn)的Java類“Hashtable”。所以在圖7中沒有顯示過程715的詳細(xì)內(nèi)容。此外,用散列表是一種可選的優(yōu)化,在最佳實(shí)施例中用于提高檢索資源信息的速度。創(chuàng)建和使用散列表要求有額外的存儲(chǔ)空間來存儲(chǔ)該表,所以,特定的實(shí)現(xiàn)可以選擇優(yōu)化空間而不是速度,因而不使用散列表實(shí)現(xiàn)。既然romLoadingClassLoader被作為類加載程序安裝并且建立了散列表430,應(yīng)用程序代碼的執(zhí)行就開始。圖5表示應(yīng)用程序請(qǐng)求資源的邏輯流程,以及最佳實(shí)施例所用的在ROM中查找資源并向應(yīng)用程序返回輸入流的技術(shù)。假設(shè)應(yīng)用程序含有的代碼要?jiǎng)?chuàng)建一個(gè)關(guān)于按“.gif”文件存儲(chǔ)的并具有資源名“picture.gif”的圖形的輸入流-如前一個(gè)例子中一樣,并且程序員選擇了名稱“pictureStream”作為將被用于這個(gè)資源的流。過程調(diào)用于是就可以如下pictureStream=getClass().getResourceAsStream(“picture.gif”)這個(gè)程序設(shè)計(jì)語句對(duì)應(yīng)于圖5的方框505。這個(gè)語句導(dǎo)致關(guān)于該對(duì)象類的getClass().getResourceAsStream()過程被調(diào)用,傳遞資源名“picture.gif”-如方框510所示。該類將按照現(xiàn)有技術(shù)自動(dòng)確定其包名,然后將自動(dòng)將該名置于資源名參數(shù)前面(方框515)。如果包名例如是“package-name/…”,方框515就創(chuàng)建串“package-name/…/picture.gif”。該類然后將調(diào)用一個(gè)關(guān)于其類加載程序的過程,傳遞這個(gè)串作為參數(shù)(方框520)。按照現(xiàn)有技術(shù)水平,這個(gè)調(diào)用是自動(dòng)發(fā)生的,調(diào)用格式為getClassLoader().getResourceAsStream(“package-name/…/picture.gif”)因?yàn)閞omLoadingClassLoader已經(jīng)被作為類加載程序安裝,并被定義為ClassLoader的子類(見圖7的元素707),所以它將截獲這個(gè)請(qǐng)求。RomLoadingClassLoader類705中的過程getResourceAsStream702然后將執(zhí)行。方框525至545對(duì)應(yīng)于過程720。就是否在散列表430存在這個(gè)資源的對(duì)應(yīng)項(xiàng)進(jìn)行判定(方框525)。根據(jù)本例,用于訪問散列表的鍵值是“package-name/…/picture.gif”。如果在表中找不到該鍵值,方框530將向應(yīng)用程序返回空值,圖5的對(duì)當(dāng)前資源請(qǐng)求的處理就結(jié)束。特定于應(yīng)用程序的處理然后就會(huì)處理這個(gè)情況,方法例如是向用戶生成一個(gè)例外條件或出錯(cuò)消息-這種處理超出了本發(fā)明的范圍。另一方面,如果找到了該鍵值,方框535就從散列表中檢出OSMemory對(duì)象432。(如果如上所述的那樣尚未構(gòu)建散列表,方框525就檢查資源表400。如果在表中找到該鍵值,方框535就根據(jù)資源表400中存儲(chǔ)的指針402和長(zhǎng)度值創(chuàng)建OSMemory對(duì)象。)然后為這個(gè)OSMemory對(duì)象構(gòu)建一個(gè)OSMemoryInputStream對(duì)象。這在721處的過程調(diào)用被執(zhí)行時(shí)發(fā)生,導(dǎo)致OSMemory類805的過程getInputStream825被調(diào)用。過程825隨后調(diào)用OSMemoryInputStream類905的過程OSMemoryInputStream910。過程910向721處的調(diào)用過程返回一個(gè)類型OSMemoryInputStream的輸入流對(duì)象。這個(gè)輸入流然后被返回(方框545)到應(yīng)用程序,后者獲得OSMemoryInputStream對(duì)象(方框550),然后開始用這個(gè)對(duì)象來訪問資源。在較早時(shí)使用的程序設(shè)計(jì)語言語句的例子中,應(yīng)用程序要將這個(gè)流對(duì)象賦予對(duì)象“pictureStream”。既然應(yīng)用程序已經(jīng)有了用于訪問該資源的、作為OSMemoryInputStream對(duì)象一個(gè)實(shí)例的輸入流,它就可以開始使用該實(shí)例一如圖6中所示。在方框605,應(yīng)用程序?qū)SMemoryInputStream調(diào)用read()過程。圖9中925處表示了讀過程的一個(gè)例子。方框610至635代表與這個(gè)過程925中的代碼對(duì)應(yīng)的邏輯。如方框610所示,read()過程進(jìn)行查驗(yàn)以保證偏移(offset)實(shí)例變量的值小于資源的總體大小。這是通過調(diào)用getSize()過程而確定的,該過程返回(821)“大小”(size)實(shí)例變量(811)的值。如果這個(gè)比較(方框615)結(jié)果是否定的,則最好將-1返回(方框620)給應(yīng)用程序,表示已經(jīng)到達(dá)該流的結(jié)尾。圖6的處理于是就結(jié)束。否則,如果方框615的結(jié)果是肯定的,處理就在方框625繼續(xù),此處,getByte()過程815被調(diào)用。這個(gè)過程815返回在通過偏移值與指向資源起始位置的指針的值相加而計(jì)算出的位置存儲(chǔ)的字節(jié)。(實(shí)現(xiàn)這個(gè)本機(jī)過程的細(xì)節(jié)不是本發(fā)明的組成部分,而對(duì)本領(lǐng)域的一般熟練人員來說則是顯而易見的)。調(diào)用過程925隨后向應(yīng)用程序返回(方框635)這個(gè)字節(jié),圖6的對(duì)這個(gè)調(diào)用的處理結(jié)束。(注意,圖6和9表示的是應(yīng)用程序一次獲得一個(gè)字節(jié),可以用按照現(xiàn)有技術(shù)水平定義的過程來用一次調(diào)用獲得多個(gè)字節(jié),其中現(xiàn)有技術(shù)的過程的潛在代碼保證反復(fù)地調(diào)用單一字節(jié)的返回)。因此可見,本發(fā)明提供了以對(duì)應(yīng)用程序透明的方式從ROM存儲(chǔ)器加載資源的有益技術(shù)。這就免得需要在在R0M中存儲(chǔ)資源時(shí)修改現(xiàn)有應(yīng)用程序代碼,使得應(yīng)用程序能無視資源是在不是諸如文件系統(tǒng)和網(wǎng)絡(luò)服務(wù)器的“常規(guī)”存儲(chǔ)器的存儲(chǔ)器中而繼續(xù)執(zhí)行。對(duì)本領(lǐng)域的一般熟練人員來說,顯然,本文中所使用的類和對(duì)象的名稱只是示意性的,可以等價(jià)地使用其它名稱。此外,可以向本文中說明的類添加過程,向已經(jīng)說明過的那些過程添加額外的功能,可以使用能替代圖7至9中所示內(nèi)容的類結(jié)構(gòu),這些都不偏離本文中所揭示的發(fā)明思想。盡管說明了本發(fā)明的最佳實(shí)施例,對(duì)于本領(lǐng)域的熟練人員來說,一旦了解了基本的發(fā)明思想,就可以在實(shí)施例中作出另外的改動(dòng)和修改。因此,希望后附的權(quán)利要求將被解釋為將最佳實(shí)施例和所有這種改動(dòng)和修改這兩方面都包含在本發(fā)明的精神和范圍內(nèi)。權(quán)利要求1.一種在計(jì)算機(jī)可讀的媒體上體現(xiàn)的、由某計(jì)算環(huán)境中的計(jì)算機(jī)可讀的、用于透明地從計(jì)算機(jī)的只讀存儲(chǔ)器(“ROM”)加載資源的計(jì)算機(jī)程序產(chǎn)品,包含存儲(chǔ)在ROM中的若干資源文件;用于在計(jì)算機(jī)上執(zhí)行一個(gè)Java虛擬機(jī)(“JVM”)的計(jì)算機(jī)可讀的程序代碼裝置;用于在JVM上執(zhí)行一個(gè)應(yīng)用程序的計(jì)算機(jī)可讀的程序代碼裝置;用于在JVM上執(zhí)行一個(gè)ROM類加載程序的計(jì)算機(jī)可讀的程序代碼裝置-ROM類加載程序適合從ROM加載資源文件;用于創(chuàng)建包含每個(gè)資源文件的對(duì)應(yīng)項(xiàng)的表的計(jì)算機(jī)可讀的程序代碼裝置;用于由ROM類加載程序接收應(yīng)用程序?qū)x定一個(gè)資源文件上的輸入流的請(qǐng)求的計(jì)算機(jī)可讀的程序代碼裝置;用于利用表在ROM中定位選定資源文件的計(jì)算機(jī)可讀的程序代碼裝置;和用于利用找到的資源返回輸入流的計(jì)算機(jī)可讀的程序代碼裝置;2.按照權(quán)利要求1的透明地加載資源的計(jì)算機(jī)程序產(chǎn)品,其中,表中的每項(xiàng)包含與特定一個(gè)資源文件的標(biāo)識(shí)符對(duì)應(yīng)的鍵值;特定資源文件在ROM中的位置;在特定資源文件所處位置存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度;并且,利用表的計(jì)算機(jī)可讀的程序代碼裝置進(jìn)一步包含用于用特定資源文件的標(biāo)識(shí)符作為鍵值來訪問表的計(jì)算機(jī)可讀的程序代碼裝置;用于在由用于訪問的計(jì)算機(jī)可讀的程序代碼裝置在表中找到匹配的項(xiàng)時(shí)返回特定資源文件的位置和長(zhǎng)度的計(jì)算機(jī)可讀的程序代碼裝置。3.按照權(quán)利要求1的透明地加載資源的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包含用于將JVM配置得能使用ROM類加載程序的計(jì)算機(jī)可讀的程序代碼裝置。4.按照權(quán)利要求1的透明地加載資源的計(jì)算機(jī)程序產(chǎn)品,其中,請(qǐng)求保持應(yīng)用程序中所規(guī)定的已有的請(qǐng)求語義不變。5.一個(gè)在計(jì)算環(huán)境中透明地從計(jì)算環(huán)境中的計(jì)算機(jī)的只讀存儲(chǔ)器(“ROM”)加載資源的系統(tǒng),包含存儲(chǔ)在ROM中的若干資源文件;用于在計(jì)算機(jī)上執(zhí)行一個(gè)Java虛擬機(jī)(“JVM”)的裝置;用于在JVM上執(zhí)行一個(gè)應(yīng)用程序的裝置;用于在JVM上執(zhí)行一個(gè)ROM類加載程序的裝置-ROM類加載程序適合從ROM加載資源文件;用于創(chuàng)建包含每個(gè)資源文件的對(duì)應(yīng)項(xiàng)的表的裝置;用于由ROM類加載程序接收應(yīng)用程序?qū)x定一個(gè)資源文件上的輸入流的請(qǐng)求的裝置;用于利用表在ROM中定位選定資源文件的裝置;和用于利用找到的資源返回輸入流的裝置;6.按照權(quán)利要求5的透明地加載資源的系統(tǒng),其中,表中的每項(xiàng)包含與特定一個(gè)資源文件的標(biāo)識(shí)符對(duì)應(yīng)的鍵值;特定資源文件在ROM中的位置;在特定資源文件所處位置存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度;并且,利用表的裝置進(jìn)一步包含用于用特定資源文件的標(biāo)識(shí)符作為鍵值來訪問表的裝置;用于在由用于訪問的裝置在表中找到匹配的項(xiàng)時(shí)返回特定資源文件的位置和長(zhǎng)度的裝置。7.按照權(quán)利要求5的透明地加載資源的系統(tǒng),進(jìn)一步包含用于將JVM配置得能使用ROM類加載程序的裝置。8.按照權(quán)利要求5的透明地加載資源的系統(tǒng),其中,請(qǐng)求保持應(yīng)用程序中所規(guī)定的已有的請(qǐng)求語義不變。9.一種透明地從計(jì)算環(huán)境中的計(jì)算機(jī)的只讀存儲(chǔ)器(“ROM”)加載資源的方法,包含的步驟為在ROM中存儲(chǔ)若干資源文件;在計(jì)算機(jī)上執(zhí)行一個(gè)Java虛擬機(jī)(“JVM”);在JVM上執(zhí)行一個(gè)應(yīng)用程序;在JVM上執(zhí)行一個(gè)ROM類加載程序-ROM類加載程序適合從ROM加載資源文件;創(chuàng)建包含每個(gè)資源文件的對(duì)應(yīng)項(xiàng)的表;由ROM類加載程序接收應(yīng)用程序?qū)x定一個(gè)資源文件上的輸入流的請(qǐng)求;利用表在ROM中定位選定資源文件;利用找到的資源返回輸入流;10.按照權(quán)利要求9的透明地加載資源的方法,其中,表中的每項(xiàng)包含與特定一個(gè)資源文件的標(biāo)識(shí)符對(duì)應(yīng)的鍵值;特定資源文件在ROM中的位置;在特定資源文件所處位置存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度;并且,利用表的步驟進(jìn)一步包含的步驟為用特定資源文件的標(biāo)識(shí)符作為鍵值來訪問表;在由訪問步驟在表中找到匹配的項(xiàng)時(shí)返回特定資源文件的位置和長(zhǎng)度。11.按照權(quán)利要求9的透明地加載資源的方法,進(jìn)一步包含將JVM配置得能使用ROM類加載程序的步驟。12.按照權(quán)利要求9的透明地加載資源的方法,其中,請(qǐng)求保持應(yīng)用程序中所規(guī)定的已有的請(qǐng)求語義不變。全文摘要一種為Java虛擬機(jī)上執(zhí)行的應(yīng)用程序透明地從只讀存儲(chǔ)器加載資源的方法、系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品。本發(fā)明一般將在沒有磁盤存儲(chǔ)器、沒有文件系統(tǒng)軟件的嵌入式計(jì)算設(shè)備上使用。本文所述的新穎的類加載程序,從ROM加載資源并按應(yīng)用程序的預(yù)期返回輸入流對(duì)象。所以,在使用本發(fā)明時(shí),不需要改動(dòng)現(xiàn)有應(yīng)用程序代碼就能使用ROM中存儲(chǔ)的資源。本發(fā)明可以用于以Java程序設(shè)計(jì)語言編寫的程序,或者用于在JVM上執(zhí)行的以其它語言編寫的程序。文檔編號(hào)G06F9/445GK1281180SQ00120239公開日2001年1月24日申請(qǐng)日期2000年7月14日優(yōu)先權(quán)日1999年7月15日發(fā)明者P·J·米勒,E·C·史密斯,T·J·沃爾夫申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司