欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

動態(tài)類封裝的制作方法

文檔序號:6597832閱讀:147來源:國知局

專利名稱::動態(tài)類封裝的制作方法版權(quán)認(rèn)可本專利文件所公布的一部分包括版權(quán)保護(hù)的內(nèi)容。在專利和商標(biāo)局的專利文件和記錄中出現(xiàn)該專利文件或該專利公布的復(fù)件時,版權(quán)擁有者不會有任何異議,不過,若該專利文件或該專利公布的復(fù)件出現(xiàn)在別的地方,則版權(quán)擁有者將要追究其責(zé)任。相關(guān)應(yīng)用的交叉參考本申請與美專利應(yīng)用NO._____(AttorneyDocketNo.AP117HO)相關(guān),該專利的提出日期與本申請的提出日期相同,名為“DYNAMICJAVACLASSLOADINGFORAPPLICATIONEXECUTION.”,該專利在此引用以供參考。
背景技術(shù)
:1
技術(shù)領(lǐng)域
總的來說,本發(fā)明有關(guān)一個可執(zhí)行程序的軟件工具的方法和裝置,更具體的,用于識別模塊,并將類與該可執(zhí)行程序的每個模塊聯(lián)系起來。2相關(guān)技術(shù)描述無論對用戶還是對軟件公司來說,借助于一個分布式網(wǎng)絡(luò)(例如因特網(wǎng))下載應(yīng)用程序都能提供誘人的利益。不過,隨著應(yīng)用程序復(fù)雜度和規(guī)模的增加,下載應(yīng)用程序所需的時間也相應(yīng)增加。不幸的是,由于下載時間的限制,撥號上網(wǎng)的用戶不得不放棄通過因特網(wǎng)下載應(yīng)用程序。圖1舉例說明了一個框圖100,該圖描述了在以前的技術(shù)中,從因特網(wǎng)下載一個可執(zhí)行應(yīng)用程序的方式,以便通過一個web瀏覽器(例如因特網(wǎng)ExplorerTM或NetscapeNavigatorTM)運(yùn)行一個Java應(yīng)用程序。服務(wù)器102有一個超文本標(biāo)記語言(HTML)頁104。該HTML頁104借助于因特網(wǎng),通過一個web瀏覽器110下載到用戶108。一個ActiveX控制被包含在該web瀏覽器中或被下載給用戶108。該ActiveX控制包含對象鏈接和嵌入(OLE)控制(OCX)114,一個包含Java程序和類文件的zip文件116,以及一個為系統(tǒng)提供安裝OCX114和zip文件116所必需的信息的.inf文件。一旦執(zhí)行了ActiveX控制,來自zip文件116的Java程序,OCX,zip文件和.inf文件就被封裝為一個.cab文件。從而,ActiveX安裝該.cab文件并解壓該zip文件,并且通過web瀏覽器運(yùn)行不同的Java應(yīng)用程序。如前面參照圖1所描述的,以前技術(shù)中下載應(yīng)用程序的方法所帶來的障礙使得用戶放棄通過因特網(wǎng)下載應(yīng)用程序。例如,利用一個56K的撥號modem,下載并安裝一個典型的.cab文件大約需要5分鐘。另外,在運(yùn)行該應(yīng)用程序之前,必須下載整個.cab文件。由于zip文件包含Java應(yīng)用程序的所有類,因此,即使用戶不使用其中的一些類,也必須等待下載完所有的類。隨著軟件功能的增強(qiáng),或是軟件中增加了更多的特定功能,由于.cab文件變大了,這一等待時間會變得更長。這一問題不僅在初次下載應(yīng)用程序時存在,而且還擴(kuò)展到對當(dāng)前應(yīng)用程序的修改中。例如,若對一個已經(jīng)存在的程序進(jìn)行1K字節(jié)的修改,以提供一個新的版本或更新,則用戶不得不下載整個應(yīng)用程序,或是接收一個帶有已修訂應(yīng)用程序的磁盤。為節(jié)約開支,軟件公司鼓勵用戶通過因特網(wǎng)下載文件,而不是提供新的或已修訂應(yīng)用程序的CD或軟盤。由于與CD或軟盤相關(guān)的費(fèi)用最終仍歸到用戶頭上,因此,能夠方便地通過因特網(wǎng)下載應(yīng)用程序?qū)τ谟脩魜碚f也是有利的。盡管在有些情況下可以提供補(bǔ)丁,但對補(bǔ)丁的管理已變得很難處理,因此,不希望使用補(bǔ)丁進(jìn)行更新。另外,補(bǔ)丁無法定位涉及該程序的最初下載的公司(?)。在從因特網(wǎng)下載一個可執(zhí)行程序時,造成所需時間過長的另一個因素是,需要下載整個的程序,包括與該程序相關(guān)的所有特性函數(shù)。由于缺乏一種工具,可以將一個可執(zhí)行程序劃分為模塊,并能知道在各個模塊中每個類由該模塊使用的情況,因此,需要下載整個應(yīng)用程序。手工分析混雜代碼以映射各種類和模塊之間的相互作用這一工作所需的工作量是令人不敢問津的。隨著程序的日益復(fù)雜,由于程序的規(guī)模更加龐大,手工分析更是無法輕易達(dá)到。即使代碼中一個微不足道的改動也需要再執(zhí)行一次全面的手工分析。另外,為了手工分析一個程序,必須能夠獲得該代碼作者的專家意見,而在當(dāng)前快速發(fā)展的環(huán)境下,很難滿足這種奢求。因此,為解決上述問題,需要一種工具,按組將類結(jié)合起來,以生成能通過一個分布式網(wǎng)絡(luò)(例如因特網(wǎng))獨(dú)立下載的可執(zhí)行程序的模塊。發(fā)明概要總的來說,本發(fā)明提供了一種監(jiān)測工具的方法和裝置,以滿足這些需要,該監(jiān)測工具用于記錄并將一個應(yīng)用程序劃分為模塊。應(yīng)該理解,本發(fā)明可以多種方式實現(xiàn),包括一個過程,一個裝置,一個系統(tǒng)或一個設(shè)備。以下將介紹本發(fā)明的幾個實例。在一個實例中,提供了一個用于識別一個可執(zhí)行程序的模塊的計算機(jī)實現(xiàn)的方法。該方法首先啟動該可執(zhí)行程序,隨后,在該可執(zhí)行程序運(yùn)行期間對其進(jìn)行監(jiān)測。對該可執(zhí)行程序的監(jiān)測還包括,識別每個模塊的相關(guān)類,這里,每個模塊都對應(yīng)于該可執(zhí)行程序的一個特定功能。該監(jiān)測還包括,在該可執(zhí)行程序運(yùn)行期間為每個模塊生成一個數(shù)據(jù)結(jié)構(gòu)。此處,數(shù)據(jù)結(jié)構(gòu)定義每個特定功能的類。在另一個實例中,提供了用于生成一個類圖的方法,類圖表明一個可執(zhí)行程序的模塊怎樣使用該可執(zhí)行程序的類。一開始,在該可執(zhí)行程序運(yùn)行時,監(jiān)測該可執(zhí)行程序。隨后,識別出與一個核心模塊相關(guān)的每個類。核心模塊用于運(yùn)行程序的引擎。隨后,在監(jiān)測該程序的同時,執(zhí)行與該程序相關(guān)的每一項任務(wù)。并記錄每項任務(wù)執(zhí)行中用到的每一個類。隨后,為核心模塊和每項任務(wù)定義一個類圖,每個類圖都定義核心模塊和每項任務(wù)中類的相互關(guān)系。在本發(fā)明的另一個實例中,還提供了一種用于將一個可執(zhí)行程序細(xì)分為自主類模塊的方法,其中,每個模塊都對應(yīng)于一項任務(wù)。一開始,先運(yùn)行該程序。隨后,監(jiān)測該程序的運(yùn)行。接著,保留每項任務(wù)運(yùn)行期間用到的類的記錄。然后再定義每個模塊的類圖,這里,類圖代表的是與每個模塊相關(guān)的類的一個相互關(guān)系。在另一個實例中,提供了一種為一個應(yīng)用程序開發(fā)一個軟件工具的方法。該應(yīng)用程序包括多個特定功能,每個特定功能都與至少一個類相聯(lián)系。該方法一開始先識別該應(yīng)用程序的每個類。隨后,運(yùn)行該應(yīng)用程序的每個特定功能。然后識別與每個特定功能相關(guān)的每個類。然后為每個特定功能定義一個模塊,這里,每個模塊都包括一組所識別出的與一個特定功能相關(guān)的類。這里,每個模塊都能夠使與該模塊相對應(yīng)的特定功能得以實現(xiàn)。在本發(fā)明的另一個實例中,提供了一種用于生成一個應(yīng)用程序的模塊的方法。該模塊能夠自主地運(yùn)行該應(yīng)用程序的一個特定功能。該方法一開始是啟動該應(yīng)用程序。隨后,請求一個用于裝入一個類的類裝入程序。接著,在裝入該模塊的每個類的同時監(jiān)測該類裝入程序。記錄該模塊的每個類。隨后,檢測一個終點(該終點表明該模塊的所有類都已裝入完畢)。接著,對該應(yīng)用程序的其余模塊重復(fù)該請求,監(jiān)測,記錄和檢測操作。在另一個實例中,提供了一個計算機(jī)可讀介質(zhì),其上存有用于生成類圖的計算計指令。該類圖表明一個可執(zhí)行程序的模塊怎樣使用該可執(zhí)行程序的類。該計算機(jī)可讀介質(zhì)包括用于在可執(zhí)行程序運(yùn)行期間對其進(jìn)行監(jiān)測的程序指令。還包括用于識別與一個核心模塊相關(guān)的每個類的程序指令,核心模塊運(yùn)行的是該程序的一個引擎。該計算機(jī)可讀介質(zhì)包括用于在可執(zhí)行程序被監(jiān)測的同時執(zhí)行與該程序相關(guān)的每項任務(wù)的程序指令。還包含用于記錄每項任務(wù)執(zhí)行時用到的每個類的程序指令。還包含用于為核心模塊和每項任務(wù)定義一個類圖的程序指令,其中,每個類圖都定義了核心模塊和每項任務(wù)中類的相互作用。本發(fā)明的優(yōu)點很多。最值得一提的是,該監(jiān)測工具允許在一個可執(zhí)行程序運(yùn)行期間對其細(xì)分。另外,本發(fā)明允許取一個復(fù)雜的程序并定義能夠提供一個用戶連接的自主程序,經(jīng)一個分布式網(wǎng)絡(luò)向用戶的計算機(jī)獨(dú)立地下載該程序的模塊。結(jié)合附圖,通過以下對本發(fā)明例子的詳細(xì)介紹,可以清楚本發(fā)明的其它方面和優(yōu)點。附圖概述結(jié)合附圖,通過以下的詳細(xì)介紹,可以更好地理解本發(fā)明,其中,相似的參考符號表示相似的結(jié)構(gòu)部件。圖1舉例說明了一個方塊圖,描述了以前從因特網(wǎng)下載一個可執(zhí)行程序的方式,以便通過一個web瀏覽器運(yùn)行一個Java程序。圖2舉例說明了一個流程圖,描述了按本發(fā)明的一個實例,從因特網(wǎng)下載一個應(yīng)用程序的方法。圖3舉例說明了一個更高水平方法的流程圖,其中,一個Java加載器按本發(fā)明的一個實例下載并安裝該應(yīng)用程序。圖4顯示了一個方塊圖,舉例說明了按本發(fā)明的一個實例,在圖3的操作146中下載的模塊列表。圖5舉例說明了一個流程圖,顯示了按本發(fā)明的一個實例,在應(yīng)用程序運(yùn)行時根據(jù)需要下載并安裝其模塊的方法。圖6舉例說明了一個流程圖,更詳細(xì)地描述了按本發(fā)明的一個實例,下載應(yīng)用程序的模塊的方法。圖7示出了了一個流程圖,更詳細(xì)地描述了圖6中的操作190,其中,按本發(fā)明的一個實例,通過一個類裝入程序線索定位一個包含所請求類的模塊。圖8示出了了一個流程圖,該流程圖表示按本發(fā)明,在主應(yīng)用程序啟動的情況下,在多線程環(huán)境中執(zhí)行后臺下載的方法。圖9是一個方塊圖,代表按本發(fā)明的一個實例,一個應(yīng)用程序要被下載的各模塊的優(yōu)先列表。圖10示出了了一個流程圖,更詳細(xì)地描述了圖7中的操作208,其中,按本發(fā)明的一個實例,在下載管理器邏輯下,在一個多線程環(huán)境中下載一個模塊。圖11示出了了一個流程圖,顯示了按本發(fā)明的一個實例,用于監(jiān)測一個可執(zhí)行程序的類的安裝的方法,以便為該程序的各特定功能生成模塊。圖12A示出了了一個方塊圖,描述了按本發(fā)明的一個實例,構(gòu)成一個應(yīng)用程序的模塊的類的列表。圖12B舉例說明了按本發(fā)明的一個實例,圖12A的模塊1的類圖。圖13舉例說明了按本發(fā)明的一個實例,在一個應(yīng)用程序執(zhí)行時監(jiān)測程序的部分輸出。圖14舉例說明了按本發(fā)明的一個實例,監(jiān)測程序從一個賀卡應(yīng)用程序捕獲的核心模塊的類的部分列表和GIF文件。推薦實例詳述本發(fā)明描述的是一個軟件工具,該軟件工具能識別一個可執(zhí)行程序的單獨(dú)的組中或模塊中使用的類,以協(xié)助從因特網(wǎng)有效地下載該可執(zhí)行程序。不過,本技術(shù)專業(yè)人員很清楚,在實現(xiàn)本發(fā)明時,可以不要這些具體細(xì)節(jié)中的一些或全部。另一方面,為了更清楚地描述本發(fā)明,一些熟知的處理操作此處不進(jìn)行詳細(xì)的介紹。本發(fā)明的實例提供了一種方法和一種裝置,用于由因特網(wǎng)及時下載應(yīng)用程序。為加速一個程序的下載,在本發(fā)明的一個實例中,首先將該程序劃分為軟件類模塊。模塊的選擇原則是,使每個模塊都包含執(zhí)行一個指定的程序任務(wù)時所必需的所有類。如此處所用到的,能夠有效地處理并下載一個應(yīng)用程序或組件的實例對任意類型的應(yīng)用程序和應(yīng)用程序組件來說都是通用的。不過,為便于解釋,以下將參照一個打印機(jī)和該打印機(jī)的用戶可以采用的應(yīng)用程序選項。這些應(yīng)用程序和選項可以在賣主的網(wǎng)址(例如)得到。例如,一個模塊可以包含用于生成一個圖形用戶接口(GUI)的所有類。另一個用于選擇并下載圖像,第三個用于打印,第四個用于旋轉(zhuǎn)或剪切一個圖像,等等。至少一個模塊必須包含運(yùn)行該實例中應(yīng)用程序的引擎所必需的核心類。核心模塊可以從命令總線接收指令,或者,核心模塊最好下載并安裝GUI以便為用戶提供更方便的接口。當(dāng)要下載一個應(yīng)用程序時,只有比整個可執(zhí)行程序小得多的核心模塊被下載。很自然,下載核心模塊的時間比下載整個文件的時間短得多。在一個實例中,核心模塊隨后下載并安裝GUI模塊,該模塊能為用戶提供不同的程序選項。在運(yùn)行該程序時,當(dāng)用戶選擇不屬于核心模塊一部分的選項時,核心模塊檢查是否可以在本地獲得能夠?qū)崿F(xiàn)所選選項的模塊。若無法獲得所要求模塊,則從web下載所要求模塊并自動卸載到正在運(yùn)行的程序中。在方法的描述見于美專利申請NO.______(代理人檔案號AP117HO)。為有效地下載該可執(zhí)行程序,需要將該程序適當(dāng)?shù)貏澐譃樽灾黝惸K。隨著程序的日益復(fù)雜,已逐漸不可能識別出指定任務(wù)或任務(wù)組所使用的所有類。本發(fā)明通過提供一個監(jiān)測工具(用來記錄該程序的模塊所使用的類)來將大量的類細(xì)分到自主模塊中。在一個實例中,在一個軟件包完成并可使用之后,一個監(jiān)測程序觀察該軟件包的執(zhí)行,并記錄在所選任務(wù)執(zhí)行期間用到的所有類。如以前所提到的,應(yīng)用程序及其選項可以是可由一個或多個處理實體執(zhí)行的任意類型的應(yīng)用程序。在一個與個人電腦相連的打印機(jī)的例子中,所選任務(wù)可以是與打印或編輯圖像或文本文件相關(guān)的任務(wù)。更具體的,可以包含諸如旋轉(zhuǎn),打印,調(diào)色,插入文本之類的任務(wù)。隨后,監(jiān)測程序為每個任務(wù)定義模塊,其中包含實現(xiàn)該任務(wù)時所使用的所有類。在本發(fā)明的另一個實例中,來自多個模塊的重復(fù)類可被移入一個公用模塊中,或只放在最頻繁使用的模塊中。需要使用附加類的不完整的模塊與包含其所需類的目標(biāo)模塊保持鏈接。或者,多個模塊公用的類可被插入核心模塊,這樣,在最初下載核心模塊以運(yùn)行該應(yīng)用程序的引擎之后,這些類總是可用的。圖2舉例說明了流程圖122,綜述了按本發(fā)明的一個實例,從因特網(wǎng)下載一個應(yīng)用程序的方法。流程圖122由操作124開始,這里,訪問提供應(yīng)用程序選項的網(wǎng)址。如以前提到的,應(yīng)用程序及其選項可以是可由一個或多個處理實體執(zhí)行的任意類型的應(yīng)用程序。在一個與個人電腦相連的打印機(jī)的例子中,一個應(yīng)用程序可以包含用于生成賀卡,邀請函,書的封面,藝術(shù)樣板,公文卡片,禮品包裝,禮品盒等的功能。隨后,執(zhí)行操作126,此處,從選項列表中選擇內(nèi)容范疇。用戶從操作124中選擇上述應(yīng)用之一,并呈現(xiàn)給用戶一個內(nèi)容范疇列表。例如,用戶可以選擇制作一個賀卡,隨后,呈現(xiàn)給用戶的是一個該賀卡要使用的內(nèi)容范疇的列表。當(dāng)然,這里可以呈現(xiàn)適用于一個賀卡的任意數(shù)量的圖像,例如,一個花紋排列,一個印刷,一個電影明星照片等。隨后,在操作128,提供選定內(nèi)容范疇的圖像選擇。在一個實例中,該圖像被存入一個數(shù)據(jù)庫。之后,該方法進(jìn)入操作130,記錄選定圖像的標(biāo)識符。這里,該圖像被存儲以便隨后由Java應(yīng)用程序使用。繼續(xù)介紹圖2,在操作132,收集打印機(jī)和紙張信息。在一個實例中,收集打印機(jī)型號,紙張尺寸,頁邊距信息等。接著,在操作134中,下載一個引導(dǎo)裝入程序,此處,web瀏覽器下載并安裝一個.cab文件,該文件用于裝入一個Java應(yīng)用程序和與該應(yīng)用程序相關(guān)的各種模塊。在操作136中,為用戶呈現(xiàn)一個安全性選項。在一個實例中,若用戶拒絕該安全性選項,則該方法中止。假設(shè)用戶接受了該安全性選項,則該方法接著執(zhí)行操作138,web瀏覽器解壓并安裝引導(dǎo)裝入程序,即,.cab文件。隨后,在操作140中,執(zhí)行引導(dǎo)裝入程序。在一個實例中,該引導(dǎo)裝入程序的形式是一個ActiveX控制。在步驟142中,引導(dǎo)裝入程序啟動一個Java加載器。在一個實例中,該Java加載器包含在.cab文件中。如以下將詳細(xì)介紹的那樣,Java加載器能以有效便利的方式下載所期望的應(yīng)用程序,即使用戶使用的是相當(dāng)慢的因特網(wǎng)連接。即,該應(yīng)用程序馬上可以使用,不管一個任務(wù)所需要的全部組件是否下載完畢。圖3示出了流程圖144,該流程圖描述了一個高層方法,其中,按照本發(fā)明的一個實例,Java加載器下載并安裝應(yīng)用程序及其組件。該方法由操作146開始,在該操作中,下載由操作124的應(yīng)用程序使用的模塊列表。在一個實例中,該模塊列表包括模塊的名稱及模塊的版本信息。在圖4中給出了一個模塊列表的例子,以下將詳細(xì)介紹。圖4中,方塊圖158示出了按照本發(fā)明的一個實例,在圖3的操作146中下載的模塊列表。應(yīng)該理解到,方塊圖158的模塊列表僅僅舉了一些模塊的例子,根據(jù)軟件應(yīng)用程序及其應(yīng)用,可以存在任意數(shù)量的模塊。考慮以前所說的應(yīng)用程序160,顯示了核心模塊和多個非核心模塊。此處,核心模塊版本1162已經(jīng)由核心模塊版本2164代替。因此,在圖3的操作146中下載的模塊列表只包含最新版本的核心模塊,即,版本2164。應(yīng)該理解,顯示核心模塊版本1只是為了起示出了的作用。圖4的列表還包括模塊1-5,由方框166-174表示。在本發(fā)明的一個實例中,將該應(yīng)用程序所使用的模塊列表與本地系統(tǒng)上的模塊進(jìn)行比較,以確定系統(tǒng)需要下載哪些模塊。返回圖3,進(jìn)入操作148,Java加載器檢查列表中的每一個模塊以確認(rèn)該模塊是否在本地系統(tǒng)中存在。例如,檢查圖4中的每個模塊,即,模塊166-174,以確認(rèn)它們是否已出現(xiàn)在本地系統(tǒng)內(nèi)。接著,在操作150中,不安裝操作148識別的任何舊的模塊版本。例如,若本地系統(tǒng)已從該應(yīng)用程序的以前使用中裝入了核心模塊版本1162,則此處就不再對其重新安裝。另外,若在本地系統(tǒng)中存在任何老版本的非核心模塊,則這些模塊不再安裝。在一個實例中,若舊版本的非核心模塊是一個共享模塊,則不再安裝該非核心模塊。隨后,進(jìn)行判定操作152,確定最新版本的核心模塊是否在系統(tǒng)上。若不在,則在操作154中下載并安裝該最新版本的核心模塊。在本發(fā)明的一個實例中,核心模塊包含具有入口點的類。在本發(fā)明的另一個實例中,Java加載器請求具有入口點的類以啟動核心模塊的下載。若最新版本的核心模塊在系統(tǒng)上,則進(jìn)行操作156,啟動該應(yīng)用程序。圖5示出了流程圖176,該流程圖描述了按本發(fā)明的一個實例的方法,即,在應(yīng)用程序運(yùn)行時,根據(jù)需要下載并安裝模塊。流程圖176由操作178開始,在本地系統(tǒng)上運(yùn)行該應(yīng)用程序。應(yīng)該理解,在用戶運(yùn)行該應(yīng)用程序并使用不同的功能時,最終將需要除核心模塊之外的一個模塊。繼續(xù)以上有關(guān)一個打印機(jī)的例子,對于一些諸如打印,編輯,格式化等之類的操作,將需要不包含在核心模塊內(nèi)的類。隨后進(jìn)行操作180,識別包含所需要的類的模塊。在操作182中,在本地系統(tǒng)上下載并安裝包含所要求類的模塊。例如,參照圖4,若該應(yīng)用程序的一個特定功能需要模塊4172,則下載并安裝模塊4172。繼續(xù)操作184,執(zhí)行由所下載模塊的類所提供的特定功能。在操作184之后,返回操作178,繼續(xù)運(yùn)行該應(yīng)用程序。當(dāng)然,該應(yīng)用程序的組件一般在后臺運(yùn)行。一個用戶可以根據(jù)需要中止或退出該應(yīng)用程序。圖6示出了了流程圖186,該流程圖更詳細(xì)地描述了按本發(fā)明的一個實例,怎樣下載該應(yīng)用程序的模塊。流程圖186由操作188開始,從Java虛擬機(jī)(JVM)接收一個請求。例如,當(dāng)最初開始該應(yīng)用程序時,一個類裝入程序?qū)腏ava虛擬機(jī)接收一個請求,運(yùn)行一個實例中的主類。在另一個實例中,該主類包含在核心模塊中。應(yīng)該理解,Java虛擬機(jī)關(guān)心的是類而非模塊,而類裝入程序?qū)㈩愑成涞侥K中。隨后,執(zhí)行操作190,找出包含該類的模塊。操作190將參照圖7詳細(xì)介紹。接著,在判定操作192中,判斷操作190中找出的模塊是否已安裝在本地系統(tǒng)上。若沒有,則在操作194中下載并安裝該模塊。若該模塊已安裝在本地系統(tǒng)上,則該方法從操作192進(jìn)到操作196,從該模塊獲得所希望的類對象。圖6的方法從模塊獲得類對象之后,該方法返回操作188。在一個實例中,類對象被返回給Java虛擬機(jī)。應(yīng)理解,在該應(yīng)用程序初始裝入本地系統(tǒng)中時,包含入口點的類請求下一個類,依此類推,直到相關(guān)的類全部裝入。在一個實例中,包含入口點的主類被映射到核心模塊中。按一個所舉的例子,類A包含入口點,一旦初始化,Java虛擬機(jī)首先請求類A。類A又請求類B,依此類推,直到構(gòu)成核心模塊的所有相關(guān)類都已裝載完畢。以上所舉例子也同樣適用于完成特定功能的其它非核心模塊。一旦包含核心模塊的類被裝入,用戶可以選擇要求特定功能的任務(wù)。在一個打印機(jī)及其應(yīng)用的例子中,用戶可能希望旋轉(zhuǎn)或打印一個圖像。一旦觸發(fā)了旋轉(zhuǎn)或打印按鈕,則該代碼將向Java虛擬機(jī)請求能允許特定功能的類。因此,Java虛擬機(jī)將請求該特定功能所需要的類,對于所請求的類及其所有相關(guān)的類重復(fù)操作188-196。如以下將參照圖8-10詳細(xì)介紹的,在另一實例中,允許特定功能的模塊可以在被用戶請求之前,在后臺被下載。流程圖190從操作198開始,Java虛擬機(jī)請求類裝入程序裝入一個類。接著進(jìn)行操作200,搜索已裝入的模塊,尋找所請求的類。本技術(shù)專業(yè)人員可以理解,Java虛擬機(jī)可以使用多種技術(shù)搜索所請求類的數(shù)據(jù)結(jié)構(gòu)。隨后,進(jìn)行判斷操作202,確定是否找到了所請求的類。若在已裝入本地系統(tǒng)的模塊中找到該類,則在操作194中,該類被返回給Java虛擬機(jī)。若未找到該類,則圖7中的方法進(jìn)入操作206,查詢服務(wù)器哪個模塊包含所請求的類。在一個實例中,每個類都與服務(wù)器上的一個模塊相聯(lián)系,即,服務(wù)器具有一個數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)將類與模塊相匹配。因此,在本發(fā)明的一個實例中,此處識別包含所請求類的模塊。在操作208中,下載包含所請求類的模塊。在一個實例中,如參照圖6所描述的那樣,逐個相關(guān)類地下載該模塊。在另一個實例中,還安裝已下載的模塊。下面的表1包含的是示出了代碼,用于按本發(fā)明的一個實例安裝該模塊。當(dāng)然,該代碼可以采用任意格式,只要能完成安裝功能就行。表1<prelisting-type="program-listing"><![CDATA[*Copyright1995-2001EPSONPaloAltoLaboratory.AllRights  Reserved.  //裝入包含在Zf.中的包  publicstaticvoidinstallPackage(FilezFile)throwsIOException{  ZipFilezf=newZipFile(zFile);  try{  ArchiveInfoai=newArchiveInfo(zf);  //保存源文件  for(Enumeratione=zf.entries();e.hasMoreElements();){  ZipEntryze=(ZipEntry)e.nextElement();  StringzipName=ze.getName();  if(!zipName.endsWith(“.class”)){  ze=zf.getEntry(zipName);  zipName=zipName.replace(‘\\’,’/’);  InputStreamis=zf.getInputStream(ze);  if(ai.isSharedModule()){  saveResource(SmartLauncher.getSharedResourceDir(),zipName,is);  }else{  saveResource(SmartLauncher.getAppResourceDir(),zipName,is);}  }  }//搜索系統(tǒng)類文件并將它們裝入共享類目錄  for(Enumeratione=ai.getSystemClasses().elements();e.hasMoreElements();){  StringsysClass=(String)e.nextElement();  ZipEntryze=getZipEntryFromClassName(zf,sysClass);  if(ze==null){  thrownewIOException(“Cannotfindsystemclass”+sysClass);  }  InputStreamis=zf.getInputStream(ze);  saveClass(SmartLauncher.getSharedSystemClassDir(),sysClass,is);  }  //搜索系統(tǒng)類文件并將它們裝入共享類目錄  for(Enumeratione=ai.getSystemResources().elements();e.hasMoreElements();){  StringsysResource=(String)e.nextElement();  ZipEntryze=zf.getEntry(sysResource);  if(ze==null){  thrownewIOException(“Cannotfindsystemclass“+sysResource);  }  InputStreamis=zf.getInputStream(ze);  SaveResource(SmartLauncher.getSharedSystemClassDir(),sysResource,is);  }  //調(diào)用安裝函數(shù)  if(ai.getMetaClass()?。絥ull){  try{  InstallClassLoaderinstallLoader=newInstallClassLoader(zf);  ClassclsMeta=installLoader.loadClass(ai.getMetaClass(),true);  Objectmc=clsMeta.newInstance();  Class[]clsParams={java.util.Hashtable.class};  Methodm=clsMeta.getMethod(“install”,clsParams);  Object[]objParams={createInstallProperties(getSmartClassLoader(),zf)};  //調(diào)用安裝函數(shù)  m.invoke(mc,objParams);  }catch(Exceptione){  //不能調(diào)用meta類安裝  System.out.println(“Installfunctionignoredinclass“+ai.getMetaClass());  }  }  }finally{  zf.close();  }]]></pre>圖8舉例說明了流程圖210,描述的是一個按本發(fā)明一個實例的方法,用于在主應(yīng)用程序開始運(yùn)行的情況下,執(zhí)行多線程環(huán)境中的后臺下載。應(yīng)該理解,流程圖210中的方法可利用參照圖7描述的方法在多線程環(huán)境中操作。流程圖210的開始是操作212,訪問要下載的模塊列表。在一個實例中,該模塊列表包括一個優(yōu)先級列表,該優(yōu)先級列表代表的是模塊在后臺環(huán)境下載的順序。以下參照圖9描述了一個優(yōu)先級列表的例子。圖9舉例說明了方框圖224,代表按本發(fā)明的一個實例,為一個應(yīng)用程序下載的各種模塊的一個優(yōu)先級列表。如框圖224所描述的,包含該應(yīng)用程序的每個模塊被指定一個優(yōu)先級。例如,核心模塊(Mc)226被指定優(yōu)先級為1,是最高優(yōu)先級。核心模塊必須被首先下載,因此,Mc必須接收最高優(yōu)先級。其余模塊M1-M5分別被指定優(yōu)先級2-6。在一個實例中,該優(yōu)先級列表被保存在一個聯(lián)網(wǎng)資源服務(wù)器中(例如,它包含該應(yīng)用程序及其模塊)。如以下將進(jìn)一步解釋的,本地系統(tǒng)在以前執(zhí)行該應(yīng)用程序時,可能已安裝了其中的一些模塊。在這種情況下,初始設(shè)置給下載管理器的是需要下載的模塊的列表,從而確保下載管理器不再下載已安裝的模塊。在本發(fā)明的一個實例中,該模塊列表還可以是圖4中的模塊列表,其中包含優(yōu)先級。返回圖8,一旦在操作212中取得了優(yōu)先級列表,則進(jìn)行操作214,檢查是否所有的模塊都已被下載到本地系統(tǒng)上了。此時,檢查參照圖3,4和9描述的列表,以確定需要下載哪個模塊。若列表中的所有模塊都已安裝在本地系統(tǒng)中了,則在操作216,該方法結(jié)束。若沒有,則繼續(xù)執(zhí)行操作218,得到要下載的一個模塊的名稱。例如,若在本地系統(tǒng)中已經(jīng)存在Mc和M2,則在操作218中得到M1的模塊名,這是因為,M1是剩余模塊中優(yōu)先級最高的。在操作220中,下載與在操作218中得到的模塊名相對應(yīng)的模塊。隨后在操作222中安裝所下載的模塊。應(yīng)該理解,按本發(fā)明的一個實例,表1中用于安裝模塊的示出了代碼可以在操作222中執(zhí)行。包含操作214-222在內(nèi)的循環(huán)重復(fù)執(zhí)行,直到下載完所有的模塊。圖10示出了了流程圖230,更詳細(xì)地描述了圖7的操作208。此處,按本發(fā)明的一個實例,在下載管理器邏輯下,在多線程環(huán)境中下載一個模塊。流程圖208由操作232開始,下載管理器請求要下載的模塊。應(yīng)該理解,類裝入程序在此處也有控制。在判定操作234中,判斷所請求的模塊是不是下載管理器正在下載的模塊。若是,則接著執(zhí)行操作236,該方法一直等待,直到下載管理器下載完該模塊。應(yīng)該理解,在該操作中可以使用本技術(shù)中熟知的通用等待技術(shù)。在圖10的判定操作234中,若所請求的模塊不是下載管理器正在下載的模塊,則進(jìn)入操作240,當(dāng)前的下載操作暫停。例如,一個用戶希望旋轉(zhuǎn)一個圖像,需要模塊4(M4)來完成該特定功能。不過,下載管理器正在下載的是模塊3(M3)。則在操作240中暫停M3的下載,從而可以下載M4,而不會與M3競爭帶寬。在本發(fā)明的一個實例中,只有在用戶中斷由優(yōu)先表控制的順序模塊下載時,才啟動包含該判定操作的下載管理器邏輯。在操作242中,下載所請求的模塊。繼續(xù)上面的例子,此處,在暫停M3時將下載M4。在一個實例中,另一個下載M3的代碼例子被用于下載M4。在操作244中,安裝所請求的模塊。接著,該方法執(zhí)行操作246,恢復(fù)被中斷下載的線程。參照上面例子,在安裝了M4之后,恢復(fù)M3的下載。隨后,在操作248,該方法開始圖8中的操作220,下載該模塊。下面的表2包含按本發(fā)明一個實例的類裝入程序的示出了代碼。當(dāng)然,該代碼可以取任意格式,只要能完成類裝入功能就行。表2<prelisting-type="program-listing"><![CDATA[/*  ″  *$WorkfileSmartClassLoaderjava$  ″  *  ″  *Copyright1995-2001EPSONPaloAltoLaboratory.AllRightsReserved.  ″  *EPSONResearchandDevelopment,Inc.ASeikoEPSONSubsidiary.*Allrights  reserved.  *  */  packageepal.compman;  importjava.util.*;  importjava.util.zip.*;  importjava.io.*;  importjava.net.*;  importjava.lang.*;  importjava.lang.reflect.*;  /**  *以下是類描述?! ?*  */  publicclassSmartClassLoaderextendsjava.lang.ClassLoader{  //從類名到所裝入的類對象的映象?! rivateHashtablem_classCache=newHashtable();  //從包名到檔案文件的映象?! rivateHashtablem_packageMap=newHashtable();  //從類名到檔案文件的映象。  privateHashtablem_classMap=newHashtable();  //從資源名到檔案文件的映象。  privateHashtablem_resourceMap=newHashtable();  publicSmartClassLoader()throwsIOException{  super();  }  publicURLgetResource(Stringname){  URLurl=getSystemResource(name);  if(url?。絥ull)  returnurl;  StringszResourceFile=name.replace(′/′,F(xiàn)ile.separatorChar);  Filef=newFile(SmartLauncher.getAppResourceDir(),szResourceFile);  try{  returnnewURL(″file″,″localhost″,f.getAbsolutePath());  }catch(Exceptione){  returnnull;  }  }  publicInputStreamgetResourceAsStream(Stringname){  IiputStreamis=getSystemResourceAsStream(name);  if(is!=null)  returnis;  StringszResourceFile=name.replace(′/′,F(xiàn)ile.separatorChar);  Filef=newFile(SmartLauncher.getAppResourceDir(),szResourceFile);  try{  returnnewFileInputStream(f);  }catch(Exceptione){  returnnull;  }  }  protectedClassloadClass(Stringname,booleanresolve)throwsClassNotFoundException{//System.out.println(name);  if(name.indexOf(″PIMJpegNative″)?。?1){inti=10;  }  if(name.indexOf(″JopsDecoder″)?。?1){  inti=10;  }  //檢查以前是否已裝入該類。  Classc=(Class)m_classCache.get(name);  if(c?。絥ull){  if(resolve){  resolveClass(c);  }  returnc;  }  ArchiveInfoai=(ArchiveInfo)m_classMap.get(name);  if(ai!=null){  //檢查該存檔信息的版本。  //竊用假設(shè)總是OK?! ?/可從Zip文件裝入該類?! ?/現(xiàn)在檢查是否應(yīng)從系統(tǒng)裝入該類?! f(ai.getSystemClasses().indexOf(name)?。?1){  //這是一個應(yīng)由系統(tǒng)的類裝入程序安裝的類?! =findSystemClass(name);  }else{  //從Zip文件裝入?! ipEntryze=SmartLauncher.getZipEntryFromClassName(ai.getZipFile(),name);  try{  c=loadClassFromZipEntry(ai.getZipFile(),ze,name);  }catch(IOExceptione){  thrownewClassNotFoundException(″Cannotfindclass″+name);  }  }  }else{  //不能從Zip文件裝入該類?! ry{  //嘗試由系統(tǒng)裝入?! =findSystemClass(name);  }catch(Exceptione){  //無法從Zip文件或系統(tǒng)裝入該類?! ?/這個類可能是  //1.未找到的分類請求資源束?! ?/2.應(yīng)被下載或安裝的一個類。  if(isResourceBundleClass(name)){  //VM請求一個封裝的打包類。  thrownewClassNotFoundException();  }//系統(tǒng)找不到該類,嘗試下載并安裝該類。  try{  Filef=SmartLauncher.getDownloadManager().getZipFile(name);  SmartLauncher.getSmartClassLoader().loadPackage(f);  }catch(Exceptionioe){  thrownewClassNotFoundException(ioe.getMessage());  }  ai=(ArchiveInfo)m_classMap.get(name);  if(ai==null){  //我們在此處應(yīng)發(fā)現(xiàn)該類?! hrownewClassNotFoundException();  }else{  try{  if(ai.getSystemClasses().indexOf(name)?。?1){  //這是一個應(yīng)該由系統(tǒng)類裝入程序裝入的類?! =findSystemClass(name);  }else{  //從Zip文件裝入。  ZipEntryze=SmartLauncher.getZipEntryFromClassName(ai.getZipFile(),name);  c=loadClassFromZipEntry(ai.getZipFile(),ze,name);  }  }catch(Exceptionex){  thrownewClassNotFoundException(ex.getMessage());  }  }  }  }  if(resolve){  resolveClass(c);  }  m_classCache.put(name,c);  returnc;}publicvoidloadPackages()throwsIOException{  Filedir=SmartLauncher.getAppDir();  String[]zfname=dir.list();  if(zfname?。絥ull){  for(inti=0;i<zfname.length;i++){  if(zfname[i].endsWith(″.zip")){  try{  loadPackage(newFile(dir,zfname[i]));  }catch(ZipExceptionze){Filef=newFile(dir,zfname[i]);  f.delete();  }  }  }  }  dir=SmartLauncher.getSharedDir();  zfname=dir.list();  if(zfname!=null){  for(inti=0;i<zfname.length;i++){  if(zfname[i].endsWith(″.zip″)){  try{  loadPackage(newFile(dir,zfname[i]));  }catch(ZipExceptionze){  Filef=newFile(dir,zfname[i]);  f.delete();  }  }  }  }}publicvoidloadPackage(FilefZipFile)throwsIOException{  ZipFilezf=newZipFile(fZipFile);  ArchiveInfoai=newArchiveInfo(zf);  //裝入該類。  for(Enumeratione=zf.entries();e.hasMoreElements();){  ZipEntryze=(ZipEntry)e.nextElement();  StringzipName=ze.getName();  if(zipName.endsWith(″.class″)){  StringclassName=getClassNameFromZipName(zipName);  m_lassMap.put(className,ai);  m_packageMap.put(getPackageName(className),ai);  }else{  zipName=zipName.replace(′\\′,′/′);  m_resourceMap.put(zipName,ai);  }  }}//裝入一個包含在Ze.中的類。privateClassloadClassFromZipEntry(ZipFilezf,ZipEntryze,StringclassName)throwsIOException{  StringszZipName=ze.getName();  InputStreamis=zf.getInputStream(ze);  ByteArrayOutputStreambaos=newByteArrayOutputStream();byte[]tempBuf=newbyte;  intbytesRead=0;try{  do{  bytesRead=is.read(tempBuf,0,1024);  if(bytesRead>0){  baos.write(tempBuf,0,bytesRead);  }  }while(bytesRead>=0);  }catch(EOFExceptioneofex){  //Thisisfine.  }is.close();byte[]clsData=baos.toByteArray();returndefineClass(className,clsData,0,clsData.length);}privateStringgetClassNameFromZipName(StringzipName){intindex=zipName.lastIndexOf(″.class″);if(index<=0)  returnnull;StringclassName=zipName.replace(′/′.′);className=className.replace(′\\′,′.′);returnclassName.substring(0,index);}/**//返回一個類的包名*/privateStringgetPackageName(StringclassName){intindex=className.lastIndexOf(".″);if(index<=0)  return″″;returnclassName.substring(0,index);}privateStringgetBaseclassName(Stringname){intiBegin=Math.max(0,name.lastIndexOf(″.″));intiEnd=name.indexOf(″_″,iBegin);if(iEnd==-1){  returnname;}]]></pre>圖11示出了了流程圖250,顯示了按照本發(fā)明的一個實例,用于監(jiān)測一個可執(zhí)行程序的類的安裝的方法,以便為程序的各特定功能生成模塊。流程圖250由操作252開始,此時,接收到一個運(yùn)行該可執(zhí)行程序的命令。接著,在操作254,產(chǎn)生對一個類的請求。在一個例子中,Java虛擬機(jī)請求該類。應(yīng)該理解,一旦該可執(zhí)行程序啟動,則一組類,即一個核心模塊,使得該程序能夠被執(zhí)行,因此,用戶馬上就可以使用該核心模塊所提供的功能。如以上所提到的,一旦啟動該程序,核心模塊就包含具有入口點的主類。該方法接著執(zhí)行操作256,監(jiān)測類裝入程序。在一個實例中,通過編寫另一個類裝入程序取代Java默認(rèn)類裝入程序(該另一個類裝入程序是對該Java類裝入程序的擴(kuò)展),來監(jiān)測該類裝入程序。隨后,在操作258,加載所請求的類。在一個實例中,從一個文件系統(tǒng)加載所請求的類。隨后,進(jìn)行操作260,記錄所裝入的類。應(yīng)該理解,類是被記錄在一個集合或矢量中的,因此,包含在一個模塊中的所有相關(guān)類都被記錄下來。因此,操作260開始定義組成核心模塊的類或組成與非核心模塊相關(guān)的模塊的類。如此處所提到的,一個非核心模塊是一個包含與該程序的一個特定功能或任務(wù)相聯(lián)系的類的模塊,而核心模塊包含的是運(yùn)行該應(yīng)用程序所必需的類。圖11的方法接著進(jìn)行操作262,此時,該類被返回Java虛擬機(jī)。在一個實例中,若返回給Java虛擬機(jī)的類與另一個類相關(guān)聯(lián),則Java虛擬機(jī)將請求該相關(guān)聯(lián)的類,并重復(fù)操作254-262。例如,若剛剛下載的類A與類B相關(guān)聯(lián),則Java虛擬機(jī)將請求類B。在操作260中記錄類B,并在該應(yīng)用程序運(yùn)行期間建立相關(guān)聯(lián)類的模型。應(yīng)該理解,一個類可以與不止一個其它類相關(guān)聯(lián)。沿著這條線索,若類B與類C和類J相關(guān)聯(lián),則Java虛擬機(jī)將請求類C和類J。因此,在應(yīng)用程序運(yùn)行期間,快速地為每個模塊生成類圖。監(jiān)測應(yīng)用程序裝入過程的邏輯能檢測一個終點,該終點表明一個特定模塊的所有類都已下載完畢。一旦到達(dá)終點,其中記錄了類的集合或矢量就完成了。即,一旦該模塊的最后一個類被裝入,則該模塊的類圖就完成了。在一個實例中,類圖被存入一個聯(lián)網(wǎng)資源服務(wù)器。接著,為下一個模塊重復(fù)圖11的方法,直到所有的模塊(代表該應(yīng)用程序的所有特定功能或任務(wù))都已被裝入。如以上所討論的,每個特定功能和任務(wù)都可按用戶的需要下載,和一個預(yù)測下載或按順序的后臺下載一樣。應(yīng)該理解,一旦裝入了核心模塊,則該應(yīng)用程序就可以開始運(yùn)行,因此,用戶可以執(zhí)行該核心模塊提供的功能。圖12A示出了了一個框圖,舉例說明了按照本發(fā)明的一個實例,構(gòu)成一個應(yīng)用程序的模塊的類的列表。模塊1264包括類A,B,C,F(xiàn),J和H,而模塊2266包括類D,E和G。在一個實例中,模塊1264可以代表一個應(yīng)用程序的核心模塊,而模塊2266代表一些特定功能。在前面提到的賀卡例子中,核心模塊264包含運(yùn)行賀卡應(yīng)用程序引擎所必需的所有類,模塊2266包含一個特定功能或任務(wù)必需的類,該特定功能或任務(wù)可以是打印,編輯,旋轉(zhuǎn),插入文本等。在圖12B中,只顯示了兩個模塊,事實上,該應(yīng)用程序可以被細(xì)分為任意數(shù)量的模塊。圖12B示出了了按本發(fā)明的一個實例,圖12A的模塊1264的示出了類圖。如圖12B所表示的,類A268與類B270相關(guān),類B270叉與類C272和類J278相關(guān),以此類推。在一個實例中,一旦模塊1264的所有類都已裝入并記錄,則生成一個類圖,該類圖的形式為聯(lián)網(wǎng)資源服務(wù)器上的一個映象。在監(jiān)測工具對應(yīng)用程序進(jìn)行監(jiān)測和記錄的同時,隨著該應(yīng)用程序每項特定功能的執(zhí)行,快速生成該映象。在一個實例中,所記錄的模塊被存儲在與服務(wù)器通信的一個存儲介質(zhì)上。隨后,服務(wù)器察看每個文件并創(chuàng)建一個數(shù)據(jù)庫,即一個映象。在一個推薦實例中,模塊被存儲為zip文件,每個模塊都與一個zip文件相關(guān)。服務(wù)器察看每個zip文件并創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu)。其結(jié)果是,在程序運(yùn)行期間為每個模塊生成一個類圖,而不是進(jìn)行手工分析代碼這項繁瑣的勞動。隨后,在下載該應(yīng)用程序時使用該類圖,如參照圖7-10所描述的那樣。在一個實例中,模塊可以包含類,圖像,文本文件,類所要求的代碼(例如動態(tài)鏈接庫(DLLs)),字符串資源或其它能夠呈現(xiàn)類所需要的特性的資源。圖13示出了了按照本發(fā)明的一個實例,在一個應(yīng)用程序運(yùn)行時監(jiān)測程序的部分輸出的例子。如圖13所顯示的,在裝入多個類時將它們記錄下來。應(yīng)該理解,除了類文件之外,在模塊中還可包含圖形互換格式(GIF)文件。GIF文件用于顯示應(yīng)用程序的各種圖形圖像,不過,在另一個實例中,可以利用聯(lián)合攝影專家組(JPEG),帶標(biāo)志圖像文件格式(TIFF)等代替GIF文件格式。對于該應(yīng)用程序的每個特性,重復(fù)圖13中所顯示的示出了輸出。若在圖13中,應(yīng)用程序剛剛開始,則監(jiān)測程序?qū)⒉蹲胶诵哪K。隨著該應(yīng)用程序每項特定功能的使用,創(chuàng)建一個模塊,并且對于每一個模塊,都生成類似于圖13的一個輸出。圖14示出了了按照本發(fā)明的一個實例,監(jiān)測程序從一個賀卡應(yīng)用程序捕捉的核心模塊的示出了類的部分輸出和GIF文件。如圖14所示出了的,一些文件包含在這一應(yīng)用程序的核心模塊中。沿著這些線索,可以充分意識到手工分析一個應(yīng)用程序的代碼,以確定該應(yīng)用程序的類之間的相互關(guān)系所需要的龐大的工作量。盡管在圖13和14中提供了監(jiān)測工具輸出的例子,但這并不意味著限定本發(fā)明。應(yīng)該理解到,賀卡應(yīng)用程序只是起舉例的作用,該應(yīng)用程序可以是任何能由一個或多個處理實體執(zhí)行的任意類型的應(yīng)用程序。監(jiān)測并記錄了該應(yīng)用程序使用的所有特定功能之后,有可能一個或多個類是多個模塊公用的。在一個實例中,重復(fù)的類被放置在一個模塊中,并為其余模塊提供到包含所需類的模塊的鏈接。在另一個實例中,重復(fù)的類被包含在核心模塊中,這是因為核心模塊總是第一個被下載,因此,總是可以使用這些公用類。在另一個實例中,公用的類被移入一個公用的模塊中,需要該公用模塊中的類的模塊可以訪問該模塊。在如何構(gòu)造任何可以下載的應(yīng)用程序的模塊,以便通過諸如因特網(wǎng)之類的分布式網(wǎng)絡(luò)有效地下載該應(yīng)用程序這一方面,本發(fā)明實例允許留有多余的可能性。盡管在以上描述本發(fā)明時,結(jié)合的是一個在一個與個人電腦相結(jié)合的操作系統(tǒng)上運(yùn)行的應(yīng)用程序,但應(yīng)該理解,本發(fā)明可以由其它例程,程序,組件,數(shù)據(jù)結(jié)構(gòu)等(它們執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型)實現(xiàn)。另外,本發(fā)明可用于其它的計算機(jī)系統(tǒng)結(jié)構(gòu),該系統(tǒng)可以包括手持設(shè)備,微處理器系統(tǒng),基于微處理器或可編程的用戶電子設(shè)備,微計算機(jī),主計算機(jī)等。本發(fā)明還可用于分布式計算系統(tǒng),其中,任務(wù)是通過遠(yuǎn)程處理設(shè)備執(zhí)行的,遠(yuǎn)程處理設(shè)備通過一個通信網(wǎng)絡(luò)連接。考慮到以上的實例,應(yīng)該理解,本發(fā)明可使用各種計算機(jī)實現(xiàn)的操作,這些操作涉及存儲在計算機(jī)系統(tǒng)中的數(shù)據(jù)。這些操作是那些請求物理實體的物理控制的操作。通常,盡管不是必需的,這些實體的形式采用的是電或磁信號,能夠被存儲,變換,組合,比較,或其它方面的控制。另外,所執(zhí)行的控制一般指的是,例如,生成,識別,判斷或比較。此處所描述的任何構(gòu)成本發(fā)明一部分的操作都是有用的機(jī)器操作。本發(fā)明還與一個用于執(zhí)行這些操作的設(shè)備或裝置相關(guān),該裝置可以是為所需目的專門構(gòu)造的,或者,它可以是一個通用計算機(jī),由存儲在其中的一個計算機(jī)程序有選擇地觸發(fā)或設(shè)定。具體的,可以使用任何帶有按本發(fā)明技術(shù)編寫的計算機(jī)程序的通用機(jī)器,或者,可以更方便地構(gòu)造一個更專用的設(shè)備來執(zhí)行所要求的操作。本發(fā)明還可體現(xiàn)為一個計算機(jī)可讀介質(zhì)上的計算機(jī)可讀代碼。該計算機(jī)可讀介質(zhì)是能存儲隨后由一個計算機(jī)系統(tǒng)讀取的數(shù)據(jù)的任意數(shù)據(jù)存儲設(shè)備。該計算機(jī)可讀介質(zhì)的例子包括硬磁盤機(jī),網(wǎng)絡(luò)附屬存儲器(NAS),只讀存儲器,隨機(jī)存取存儲器,CD-ROM,CD-R,CD-RW,磁帶和其它光學(xué)或非光學(xué)數(shù)據(jù)存儲設(shè)備。該計算機(jī)可讀介質(zhì)還可分布在一個與計算機(jī)系統(tǒng)相連的網(wǎng)絡(luò)上,從而,可以分布式的方式存儲并執(zhí)行該計算機(jī)可讀代碼。盡管以上為了便于理解,已詳細(xì)介紹了本發(fā)明,但應(yīng)該理解,在附加權(quán)利要求的范圍內(nèi),可以對以上所描述的方法進(jìn)行某些修改。如以上所提到的,盡管在一些實例中參照一個打印機(jī)應(yīng)用程序的例子討論了應(yīng)用程序,但該應(yīng)用程序可以是任意類型的能由一個或多個處理實體處理的應(yīng)用程序。因此,本發(fā)明的實例起的是舉例說明的作用,并不限定本發(fā)明的范圍,本發(fā)明并不局限于此處給出的細(xì)節(jié),在附加權(quán)利要求的范圍和等價形式之內(nèi)可以對本發(fā)明進(jìn)行修改。權(quán)利要求1.一種計算機(jī)實現(xiàn)的方法,用于識別一個可執(zhí)行程序的模塊,該方法包括啟動該可執(zhí)行程序;在該可執(zhí)行程序執(zhí)行期間,監(jiān)測該可執(zhí)行程序,該監(jiān)測包括識別每個模塊的相互關(guān)聯(lián)類,每個模塊都對應(yīng)于該可執(zhí)行程序的一個特定功能;在該可執(zhí)行程序執(zhí)行期間為每個模塊生成一個數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)定義每個特定功能的類。2.權(quán)利要求1中所陳述的方法,其中,這些模塊之一是一個核心模塊。3.權(quán)利要求1中所陳述的方法,其中監(jiān)測可執(zhí)行程序的步驟還包括在一個集合中記錄相互關(guān)聯(lián)的類;并存儲該數(shù)據(jù)結(jié)構(gòu)。4.權(quán)利要求3中所陳述的方法,其中該數(shù)據(jù)結(jié)構(gòu)被存儲在一個聯(lián)網(wǎng)資源服務(wù)器上。5.權(quán)利要求1中所陳述的方法,其中監(jiān)測可執(zhí)行程序的步驟還包括將兩個或多個模塊公用的類組合在一個獨(dú)立模塊中。6.一種生成類圖的方法,該類圖表明一個可執(zhí)行程序的模塊怎樣使用該可執(zhí)行程序的類,該方法包括在該可執(zhí)行程序執(zhí)行期間監(jiān)測該可執(zhí)行程序;識別與一個核心模塊相聯(lián)系的每個類,該核心模塊用來運(yùn)行該程序的引擎;在該程序被監(jiān)測的同時執(zhí)行與該程序有關(guān)的每項任務(wù);執(zhí)行每項任務(wù)執(zhí)行時用到的每個類;為核心模塊和每項任務(wù)定義一個類圖,其中,每個類圖都定義核心模塊和每項任務(wù)中類的相互作用。7.權(quán)利要求6中所陳述的方法,其中執(zhí)行每項任務(wù)還包括請求與每項任務(wù)相關(guān)的每個類。8.權(quán)利要求7中所陳述的方法,其中從一個文件系統(tǒng)中裝入所請求的類。9.權(quán)利要求6中所陳述的方法,其中該可執(zhí)行程序是一個打印應(yīng)用程序。10.一種方法,用于將一個可執(zhí)行程序細(xì)分為自主類模塊,其中,每個模塊對應(yīng)于一項任務(wù),該方法包括執(zhí)行該程序;監(jiān)測該程序的執(zhí)行;保留每項任務(wù)執(zhí)行期間使用的類的記錄;為每個模塊定義一個類圖,該類圖表示與每個模塊相關(guān)的類的相互作用。11.權(quán)利要求10中所陳述的方法,其中保留一個類的記錄還包括通過一個類裝入程序裝入該類;記錄所裝入的類;向一個Java虛擬機(jī)返回該類。12.權(quán)利要求11中所陳述的方法,還包括檢測一個終點,該終點表明每個模塊的所有類都已裝入完畢。13.權(quán)利要求10中所陳述的方法,其中這些模塊之一是一個運(yùn)行該可執(zhí)行程序的引擎的核心模塊。14.權(quán)利要求10中所陳述的方法,其中每項任務(wù)的類的記錄被保存為一個zip文件。15.權(quán)利要求10中所陳述的方法,其中每個模塊都與一個zip文件相關(guān)。16.權(quán)利要求13中所陳述的方法,其中保留每項任務(wù)執(zhí)行期間用到的類的記錄的步驟還包括識別多個模塊公用的類;和將識別出的多個模塊公用的類放在核心模塊中。17.為一個應(yīng)用程序開發(fā)一個軟件產(chǎn)品的方法,該應(yīng)用程序具有多項特定功能,其中每項特定功能都與至少一個類相關(guān),該方法包括識別該應(yīng)用程序的每個類;執(zhí)行該應(yīng)用程序的每項特定功能;識別與每項特定功能相關(guān)的每個類;為每項特定功能定義一個模塊,每個模塊都包含所識別出的與某特定功能相關(guān)的一組類,其中每個模塊都能使與該模塊相對應(yīng)的功能得以完成。18.權(quán)利要求17中所陳述的方法,其中一個模塊是一個核心模塊,包含帶有該應(yīng)用程序入口點的主類。19.權(quán)利要求17中所陳述的方法,其中為每個特定功能定義一個模塊的步驟還包括將該模塊的每個類存入一個集合。20.權(quán)利要求19中所陳述的方法,其中該模塊被存儲為一個聯(lián)網(wǎng)資源服務(wù)器上的一個zip文件,根據(jù)來自一個Java虛擬機(jī)請求,通過一個網(wǎng)絡(luò)下載該zip文件。21.權(quán)利要求20中所陳述的方法,其中通過網(wǎng)絡(luò)的下載是由來自用戶的一個要求,一個預(yù)測下載和一個按順序的后臺下載啟動的。22.一種用于生成一個應(yīng)用程序的一個模塊的方法,該模塊能自主運(yùn)行該應(yīng)用程序的一個特定功能,該方法包括啟動該應(yīng)用程序;請求一個類裝入程序裝入一個類;在裝入該模塊的每個類時,對該類裝入程序進(jìn)行監(jiān)測;記錄該模塊的每個類;檢測一個終點,該終點表明該模塊的所有類都已下載完畢。對于該應(yīng)用程序的其余模塊,重復(fù)該請求,監(jiān)測,記錄和檢測步驟。23.權(quán)利要求22中所陳述的方法,其中一個Java虛擬機(jī)請求該類裝入程序。24.權(quán)利要求22中所陳述的方法,其中該模塊的每個類都被記錄在一個集合和一個矢量之一中。25.權(quán)利要求22中所陳述的方法,還包括將所記錄的類返回給一個Java虛擬機(jī)。26.權(quán)利要求22中所陳述的方法,其中該應(yīng)用程序提供一個打印機(jī)的功能。27.一個帶有用來生成類圖的程序指令的計算機(jī)可讀介質(zhì),該類圖表明一個可執(zhí)行程序的模塊怎樣使用該可執(zhí)行程序的類,該計算機(jī)可讀介質(zhì)包括用于在該可執(zhí)行程序運(yùn)行時監(jiān)測該程序的程序指令;用于識別與一個核心模塊相關(guān)的每個類的程序指令,該核心模塊運(yùn)行該程序的一個引擎;用于在監(jiān)測該程序的同時,執(zhí)行與該程序相關(guān)的每項任務(wù)的程序指令;用于記錄每項任務(wù)執(zhí)行時用到的每個類的程序指令;用于為核心模塊和每項任務(wù)定義一個類圖的程序指令,其中每個類圖都定義核心模塊和每項任務(wù)中類的相互作用。28.權(quán)利要求27中所陳述的計算機(jī)可讀介質(zhì),其中用于記錄每個類的程序指令還包括用于檢測一個終點的程序指令,該終點表明該核心模塊的所有類都已裝入完畢。29.權(quán)利要求27中所陳述的計算機(jī)可讀介質(zhì),還包括用于識別與一個非核心模塊相關(guān)的類的程序指令,該非核心模塊使用戶能夠使用該應(yīng)用程序的一項特定功能。30.權(quán)利要求29中所陳述的計算機(jī)可讀介質(zhì),其中核心模塊和非核心模塊是經(jīng)一個分布式網(wǎng)絡(luò)下載的。全文摘要此處為一個軟件工具提供了方法和計算機(jī)可讀介質(zhì),該軟件工具用于將程序細(xì)分為自主模塊,其中這些模塊能使該程序的特定功能得以完成。一個示出了方法包括一個計算機(jī)實現(xiàn)的方法,用于識別一個可執(zhí)行程序的模塊。該方法首先啟動讀可執(zhí)行程序。隨后,在該程序運(yùn)行期間對其進(jìn)行監(jiān)測。對該可執(zhí)行程序的監(jiān)測還包括,為每個模塊識別相關(guān)的類,其中,每個模塊對應(yīng)于該可執(zhí)行程序的特定功能。文檔編號G06F11/36GK1416058SQ0214815公開日2003年5月7日申請日期2002年10月31日優(yōu)先權(quán)日2001年10月31日發(fā)明者李家欣,B·陳申請人:精工愛普生株式會社
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
汤原县| 格尔木市| 读书| 天台县| 西华县| 疏附县| 公主岭市| 贵溪市| 治县。| 黔东| 玛纳斯县| 鹤峰县| 民县| 松滋市| 柘城县| 苏尼特右旗| 宜城市| 商水县| 安阳市| 崇左市| 长白| 永和县| 卫辉市| 鹿邑县| 乌拉特前旗| 县级市| 正阳县| 剑阁县| 江北区| 全南县| 贡山| 济阳县| 盘山县| 宝坻区| 博客| 上犹县| 大同市| 凤城市| 睢宁县| 乐安县| 浮山县|