專利名稱:Java操作系統(tǒng)中類裝載的實現(xiàn)方法
技術領域:
本發(fā)明涉及Java類裝載和操作系統(tǒng),尤其是涉及一種Java操作系統(tǒng)中類裝載的實現(xiàn)方法。
背景技術:
Java語言是由Sun公司推出的跨平臺面向?qū)ο蟾呒壋绦蛟O計語言,目前正在各個領域取得越來越重要的地位,已經(jīng)成為最重要的程序設計語言之一。
Java語言的可執(zhí)行代碼是編譯以后統(tǒng)一標準的Java字節(jié)碼(Byte Code),只要在一個平臺上有Java虛擬機,那么所有的Java可執(zhí)行代碼都可以在這個Java虛擬機支持之下運行,因而Java具有跨平臺的優(yōu)良特性。
目前的Java虛擬機環(huán)境之下,沒有多進程的概念。Java語言中定義的線程包括一個內(nèi)存入口點地址、一個出口點地址以及能夠順序執(zhí)行的代碼序列。但是進程與線程的重要區(qū)別在于線程不能夠單獨執(zhí)行,它必須運行在處于活動狀態(tài)的應用程序進程中,因此可以定義線程是程序內(nèi)部的具有并發(fā)性的順序代碼流。多線程的意義在于一個應用程序的多個邏輯單元可以并發(fā)地執(zhí)行。但是多線程并不意味著多個用戶進程在執(zhí)行,操作系統(tǒng)也不把每個線程作為獨立的進程來分配獨立的系統(tǒng)資源。進程可以創(chuàng)建其子進程,子進程與父進程擁有不同的可執(zhí)行代碼和數(shù)據(jù)內(nèi)存空間。而在用于代表應用程序的進程中多個線程共享數(shù)據(jù)內(nèi)存空間,但保持每個線程擁有獨立的執(zhí)行堆棧和程序執(zhí)行上下文。在現(xiàn)在操作系統(tǒng)中,多進程并發(fā)操作是十分普遍的,而要實現(xiàn)多個Java程序并發(fā),則每一個Java程序的執(zhí)行都需要一個單獨的Java虛擬機來支持。這種方式在通常情況之下并沒有太大問題,因為Java可執(zhí)行代碼由虛擬機解釋執(zhí)行,從宿主操作系統(tǒng)(即支持Java虛擬機運行的操作系統(tǒng))的角度來說,就是一個以一個Java可執(zhí)行代碼作為輸入的Java虛擬機進程。多進程的所有相關問題可以由操作系統(tǒng)的進程管理機制來處理。但是在某些特殊情況之下,比如沒有宿主操作系統(tǒng)的環(huán)境之下,如果要支持多進程并發(fā)執(zhí)行,則必須由虛擬機來負責進程管理的工作。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種Java操作系統(tǒng)中類裝載器的實現(xiàn)方法。
本發(fā)明解決其技術問題采用的技術方案如下
一種Java操作系統(tǒng)中類裝載的實現(xiàn)方法類裝載將包含在類文件中的字節(jié)碼裝載到Java操作系統(tǒng)中,并使其成為Java操作系統(tǒng)中運行進程的一部分。
這個類裝載過程通過以下方法a、初始化基本類裝載基本類型為int、boolean及基本類Object、Class、Void、Boolean、Integer,調(diào)用裝載靜態(tài)類方法裝載,基本類型也當作類裝載并加入到類池表項;b、裝載靜態(tài)類將要裝載的類名作為該函數(shù)的一個參數(shù)傳入,先通過調(diào)用查詢類入口方法檢查類是不是已經(jīng)在類池區(qū),如果已經(jīng)在類池中,則直接返回;如果不在類池中,則分配一個新的類表項結(jié)構(gòu),并返回指向該處的指針,然后尋找類并裝載;該方法在類路徑指定的目錄下或者Jar文件中查詢類文件,從類庫讀取字節(jié)碼,并將其賦值給對象,返回該對象,再將這個對象賦值給classEntry->class指針,然后調(diào)用類處理方法處理已裝載的類;c、處理類由于其他線程可能也要處理同一個類,因此該方法是同步的,處理裝載類之前,必須先處理該類的超類,如果該類沒有超類,則拋出異常,第一步解決類的對象區(qū)、靜態(tài)區(qū)和接口,完成裝載過程;第二步驗證類的格式;第三步驗證字節(jié)碼;一個Java應用程序使用兩種類型的類裝載器根裝載器和用戶定義的裝載器,根裝載器是Java虛擬機實現(xiàn)的一部分,如果一個Java虛擬機是在現(xiàn)在已經(jīng)存在并且正在被使用的操作系統(tǒng)的頂部用C程序來實現(xiàn)的,那么根裝載器將是那些C程序的一部分,根裝載器以某種默認的方式將類裝入,包括那些JavaAPI的類。在運行期間,一個Java程序能安裝用戶自己定義的類裝載器,根裝載器是虛擬機固有的一部分,而用戶定義的類裝載器則不是,它是用Java語言寫的,被編譯成class文件之后然后再被裝入到虛擬機,并像其它的任何對象一樣可以被實例化;Java操作系統(tǒng)中的類裝載模型是一種代理模型,當Java操作系統(tǒng)要求類裝載器裝載一個類時,類裝載器首先將這個類裝載請求轉(zhuǎn)發(fā)給他的父裝載器,只有當父裝載器沒有裝載并無法裝載這個類時,類裝載器才獲得裝載這個類的機會,這樣所有類裝載器的代理關系構(gòu)成了一種樹狀的關系;樹的根是類的根裝載器,在Java操作系統(tǒng)中它以“null”表示,除根裝載器以外的類裝載器有且僅有一個父裝載器,在創(chuàng)建一個裝載器時,如果沒有顯式地給出父裝載器,那么Java操作系統(tǒng)中將默認系統(tǒng)裝載器為其父裝載器;
Java操作系統(tǒng)中具有●根裝載器沒有父裝載器,是Java操作系統(tǒng)實現(xiàn)的一部分;●擴展裝載器繼承的父裝載器為根裝載器,不像根裝載器可能與運行時的操作系統(tǒng)有關,用純Java代碼實現(xiàn)的;●系統(tǒng)裝載器從CLASSPATH環(huán)境變量中裝載代碼的,用純Java代碼實現(xiàn),同時還是用戶自定義類裝載器的缺省父裝載器;●小應用程序裝載器從用戶指定的網(wǎng)絡上的特定目錄裝載小應用程序代碼。
相比較別的類加載手段,本類裝載器尋找一個類或是一個接口的二進制形式,并用該二進制形式來構(gòu)造代表這個類或是這個接口的class對象。類或接口的名稱可以是給定了的,也可以通過尋址得到,通過搜索源代碼經(jīng)過編譯器編譯后所得到的二進制形式來構(gòu)造。
本發(fā)明具有的有益效果是類裝載器把一個類裝入Java虛擬機中,經(jīng)過三個裝載、鏈接和初始化步驟來完成,方便的完成校驗、準備和解析三步,能夠快速加載,而且使用了很少的內(nèi)存空間,特別適用于嵌入式系統(tǒng)中。尤其是面向嵌入式系統(tǒng)的Java操作系統(tǒng),有重大意義。
附圖是Java類裝載器的體系結(jié)構(gòu)。
具體實施方法類裝載將包含在類文件中的字節(jié)碼裝載到Java操作系統(tǒng)中,并使其成為Java操作系統(tǒng)中運行進程的一部分。
這個類裝載過程通過以下方法a、初始化基本類裝載基本類型如int、boolean等及基本類如Object、Class、Void、Boolean、Integer等,調(diào)用裝載靜態(tài)類方法裝載(基本類型也當作類裝載并加入到類池表項)。
b、裝載靜態(tài)類將要裝載的類名作為該函數(shù)的一個參數(shù)傳入。先通過調(diào)用查詢類入口方法檢查類是不是已經(jīng)在類池區(qū)。如果已經(jīng)在類池中,則直接返回;如果不在類池中,則分配一個新的類表項結(jié)構(gòu),并返回指向該處的指針。然后,嘗試尋找類并裝載。
該方法在類路徑指定的目錄下或者Jar文件中查詢類文件,從類庫讀取字節(jié)碼,并將其賦值給對象,返回該對象。再將這個對象賦值給classEntry->class指針,然后調(diào)用類處理方法處理已裝載的類。
c、處理類由于其他線程可能也要處理同一個類,因此該方法必須是同步的。處理裝載類之前,必須先處理該類的超類。如果該類沒有超類(如Object),則拋出異常。第一步解決類的對象區(qū)、靜態(tài)區(qū)和接口,完成裝載過程;第二步驗證類的格式;第三步驗證字節(jié)碼。
一個Java應用程序使用兩種類型的類裝載器根裝載器(bootstrap)和用戶定義的裝載器(user-defined)。根裝載器是Java操作系統(tǒng)實現(xiàn)的一部分,比如,如果一個Java操作系統(tǒng)是在現(xiàn)在已經(jīng)存在并且正在被使用的操作系統(tǒng)的頂部用C程序來實現(xiàn)的,那么根裝載器將是那些C程序的一部分。根裝載器以某種默認的方式將類裝入,包括那些Java API的類。在運行期間,一個Java程序能安裝用戶自己定義的類裝載器。根裝載器是虛擬機固有的一部分,而用戶定義的類裝載器則不是,它是用Java語言寫的,被編譯成class文件之后然后再被裝入到虛擬機,并像其它的任何對象一樣可以被實例化。
Java操作系統(tǒng)中的類裝載模型是一種代理模型。當Java操作系統(tǒng)要求類裝載器裝載一個類時,類裝載器首先將這個類裝載請求轉(zhuǎn)發(fā)給他的父裝載器。只有當父裝載器沒有裝載并無法裝載這個類時,類裝載器才獲得裝載這個類的機會。這樣,所有類裝載器的代理關系構(gòu)成了一種樹狀的關系。樹的根是類的根裝載器,在Java操作系統(tǒng)中它以“null”表示。除根裝載器以外的類裝載器有且僅有一個父裝載器。在創(chuàng)建一個裝載器時,如果沒有顯式地給出父裝載器,那么Java操作系統(tǒng)中將默認系統(tǒng)裝載器為其父裝載器。
Java操作系統(tǒng)中具有●根裝載器沒有父裝載器,是Java操作系統(tǒng)實現(xiàn)的一部分;●擴展裝載器繼承的父裝載器為根裝載器,不像根裝載器可能與運行時的操作系統(tǒng)有關,用純Java代碼實現(xiàn)的;●系統(tǒng)裝載器從CLASSPATH環(huán)境變量中裝載代碼的,用純Java代碼實現(xiàn)。同時還是用戶自定義類裝載器的缺省父裝載器。
●小應用程序(Applet)裝載器從用戶指定的網(wǎng)絡上的特定目錄裝載小應用程序代碼。
根據(jù)類裝載器的不同處理階段,劃分成三個階段來處理,分別為類裝載、類組裝和類處理。
中展示了整個類裝載器的流程。
(1)類裝載讀取類文件的字節(jié)碼,將這些字節(jié)碼轉(zhuǎn)換成該Java操作系統(tǒng)的類表示格式,并存儲在Java操作系統(tǒng)的方法區(qū)中(類池)。
類裝載子程序借助類池管理模塊查詢該類是否已經(jīng)被裝載到Java操作系統(tǒng)類池,如果未被裝載,則將該類的入口表項裝入類池。當該類的入口表項裝載到類池后,從類入口查看該類文件是否已經(jīng)轉(zhuǎn)換成該Java操作系統(tǒng)的類表示格式并存儲在Java操作系統(tǒng)的運行時數(shù)據(jù)區(qū)。如果還未被轉(zhuǎn)換,則借助類路徑管理模塊為之定位并讀取類文件。而類路徑管理模塊則借助類讀取模塊將類文件經(jīng)轉(zhuǎn)換成該Java操作系統(tǒng)的類表示格式。而類讀取模塊轉(zhuǎn)而借助類組裝子程序組裝類的數(shù)據(jù)結(jié)構(gòu)。之后,類裝載子程序?qū)⒁蜒b載的該類的指針傳遞給類處理模塊進行鏈接、解析和初始化。
(2)類組裝調(diào)用讀入的類信息轉(zhuǎn)換成該Java操作系統(tǒng)的類表示格式,為裝載的類添加其源文件信息、接口、內(nèi)部類信息、方法、異常及域等。
a、根據(jù)要裝載的類的名字和類裝載器來查找這個類是否已經(jīng)被裝載入類池中。一個類可以多次裝載入類池中,只要它每次使用不同的類裝載器。如果沒有找到,就創(chuàng)建一個空的節(jié)點。
b、查看狀態(tài)節(jié)點。如該類處于未被裝載狀態(tài),則判斷是需要由其它類裝載器裝載,還是由自己負責裝載。然后,判斷是使用自定義的類轉(zhuǎn)載器還是使用系統(tǒng)裝載器。
c、根據(jù)被裝載類的名字,通過類路徑環(huán)境變量得到它所屬目錄或jar包中的類全名。再通過類讀取函數(shù)讀出類文件中的內(nèi)容,返回一個對象。
本Java操作系統(tǒng)軟件已經(jīng)向中華人民共和國版權局申請計算機軟件著作權登記。
權利要求
1.一種Java操作系統(tǒng)中類裝載的實現(xiàn)方法,其特征在于類裝載將包含在類文件中的字節(jié)碼裝載到Java操作系統(tǒng)中,并使其成為Java操作系統(tǒng)中運行進程的一部分;這個類裝載過程通過以下方法a、初始化基本類裝載基本類型為int、boolean及基本類Object、Class、Void、Boolean、Integer,調(diào)用裝載靜態(tài)類方法裝載,基本類型也當作類裝載并加入到類池表項;b、裝載靜態(tài)類將要裝載的類名作為該函數(shù)的一個參數(shù)傳入,先通過調(diào)用查詢類入口方法檢查類是不是已經(jīng)在類池區(qū),如果已經(jīng)在類池中,則直接返回;如果不在類池中,則分配一個新的類表項結(jié)構(gòu),并返回指向該處的指針,然后尋找類并裝載;該方法在類路徑指定的目錄下或者Jar文件中查詢類文件,從類庫讀取字節(jié)碼,并將其賦值給對象,返回該對象,再將這個對象賦值給classEntry->class指針,然后調(diào)用類處理方法處理已裝載的類;c、處理類由于其他線程可能也要處理同一個類,因此該方法是同步的,處理裝載類之前,必須先處理該類的超類,如果該類沒有超類,則拋出異常,第一步解決類的對象區(qū)、靜態(tài)區(qū)和接口,完成裝載過程;第二步驗證類的格式;第三步驗證字節(jié)碼;一個Java應用程序使用兩種類型的類裝載器根裝載器和用戶定義的裝載器,根裝載器是Java虛擬機實現(xiàn)的一部分,如果一個Java虛擬機是在現(xiàn)在已經(jīng)存在并且正在被使用的操作系統(tǒng)的頂部用C程序來實現(xiàn)的,那么根裝載器將是那些C程序的一部分,根裝載器以某種默認的方式將類裝入,包括那些Java API的類。在運行期間,一個Java程序能安裝用戶自己定義的類裝載器,根裝載器是虛擬機固有的一部分,而用戶定義的類裝載器則不是,它是用Java語言寫的,被編譯成class文件之后然后再被裝入到虛擬機,并像其它的任何對象一樣可以被實例化;Java操作系統(tǒng)中的類裝載模型是一種代理模型,當Java操作系統(tǒng)要求類裝載器裝載一個類時,類裝載器首先將這個類裝載請求轉(zhuǎn)發(fā)給他的父裝載器,只有當父裝載器沒有裝載并無法裝載這個類時,類裝載器才獲得裝載這個類的機會,這樣所有類裝載器的代理關系構(gòu)成了一種樹狀的關系;樹的根是類的根裝載器,在Java操作系統(tǒng)中它以“null”表示,除根裝載器以外的類裝載器有且僅有一個父裝載器,在創(chuàng)建一個裝載器時,如果沒有顯式地給出父裝載器,那么Java操作系統(tǒng)中將默認系統(tǒng)裝載器為其父裝載器;Java操作系統(tǒng)中具有●根裝載器沒有父裝載器,是Java操作系統(tǒng)實現(xiàn)的一部分;●擴展裝載器繼承的父裝載器為根裝載器,不像根裝載器可能與運行時的操作系統(tǒng)有關,用純Java代碼實現(xiàn)的;●系統(tǒng)裝載器從CLASSPATH環(huán)境變量中裝載代碼的,用純Java代碼實現(xiàn),同時還是用戶自定義類裝載器的缺省父裝載器;●小應用程序裝載器從用戶指定的網(wǎng)絡上的特定目錄裝載小應用程序代碼。
全文摘要
本發(fā)明提供了一種Java操作系統(tǒng)中類裝載的實現(xiàn)方法。類裝載將包含在類文件中的字節(jié)碼裝載到Java操作系統(tǒng)中,通過初始化基本類、裝載靜態(tài)類、處理具體實例類的一個過程,使用一系列裝載器,將Java類裝載到Java操作系統(tǒng)中運行。本發(fā)明對嵌入式系統(tǒng)環(huán)境,尤其是面向嵌入式系統(tǒng)的Java操作系統(tǒng),有重大意義。
文檔編號G06F9/445GK1801093SQ20061004914
公開日2006年7月12日 申請日期2006年1月17日 優(yōu)先權日2006年1月17日
發(fā)明者陳天洲, 戴鴻君, 黃彧 申請人:浙江大學