<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java class loading技術(shù)研究

    Posted on 2007-03-23 14:07 久城 閱讀(895) 評(píng)論(1)  編輯  收藏 所屬分類: Java理解筆記

    最近在忙畢業(yè)設(shè)計(jì),被分到的課題是 :java class loading技術(shù)研究

    第一次接觸java虛擬機(jī)方面的問題,對(duì)我來說,還真有些困難。查了兩天的資料,簡(jiǎn)單整理一下。

    一個(gè)類代表要執(zhí)行的代碼,而數(shù)據(jù)則表示其相關(guān)狀態(tài)。狀態(tài)時(shí)常改變,而代碼則不會(huì)。當(dāng)我們將一個(gè)特定的狀態(tài)與一個(gè)類相對(duì)應(yīng)起來,也就意味著將實(shí)例化一個(gè)對(duì)象。盡管相同的類對(duì)應(yīng)的實(shí)例的狀態(tài)千差萬別,但其本質(zhì)都對(duì)應(yīng)著同一段代碼。在JAVA中,一個(gè)類通常有著一個(gè).class文件,但也有例外。

    我們所編譯的代碼,都是首先通過編譯器編譯成字節(jié)碼文件。對(duì)于JAVA來說,就是生成一個(gè)一個(gè)的.class文件。當(dāng)我們運(yùn)行程序的時(shí)候,再由JAVA虛擬機(jī)將所需要的.class文件加載進(jìn)內(nèi)存。(這個(gè)時(shí)候的工作由每一個(gè)加載器來完成)。我的畢設(shè)所要研究的問題就在這里。如何自己定義一個(gè)classloader?自定義的classloader由什么意義呢?呵呵,才接觸兩天,具體的我還沒理解透呢。

    關(guān)于classloader:
    classloader是一種tree-like的hierarchy的結(jié)構(gòu),這顆樹的root是bootstrap classloader。當(dāng)JVM啟動(dòng)后,系統(tǒng)往往會(huì)有三個(gè)或三個(gè)以上的Class Loader,也即:Bootstrap CL, Extension CL, System CL和User-defined CL。任何的CL都有一個(gè)parent CL(Bootstrap CL除外),從而所有的CL形成一顆自上而下的樹,其中Bootstrap CL是這顆樹的Root。
    Bootstrap CL
    └──Extension CL
    └──System CL
    └──User-defined CL.(classLoaderA)
    └──User-defined CL.(classLoaderB)

    流程:

    當(dāng)執(zhí)行“ java XXX.class ”時(shí), java.exe 首先找到 JRE Java Runtime Environment ),接著找到位于 JRE 之中的 jvm.dll ,最后載入 jvm.dll 并啟動(dòng)虛擬機(jī)。

    虛擬機(jī)一啟動(dòng),先做一些初始化動(dòng)作,如獲取系統(tǒng)參數(shù)等,然后產(chǎn)生 BL BL 加載 Java 基礎(chǔ)類,這些類都存放在 JRE 中的 lib 目錄下,可由 System.getProperty(“sun.boot.class.path”) 列出。

    jvm建立->初始化動(dòng)作->產(chǎn)生第一個(gè)ClassLoader,即bootstrap loader->bootstrap loader在sum.misc.Launcher類里面的ExtClassLoader,并設(shè)定其Parent為null->bootstrap loader載入sun.misc.Launcher$AppClassLoader,并設(shè)定其parent為ExtClassLoader(但是AppClassLoader也是由bootstrap loader所載入的)->AppClassLoader載入各個(gè)xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader載入.

    Java類裝載體系結(jié)構(gòu)

    裝載類的過程非常簡(jiǎn)單:查找類所在位置,并將找到的Java類的字節(jié)碼裝入內(nèi)存,生成對(duì)應(yīng)的Class對(duì)象。Java的類裝載器專門用來實(shí)現(xiàn)這樣的過程,JVM并不止有一個(gè)類裝載器,事實(shí)上,如果你愿意的話,你可以讓JVM擁有無數(shù)個(gè)類裝載器,當(dāng)然這除了測(cè)試JVM外,我想不出還有其他的用途。你應(yīng)該已經(jīng)發(fā)現(xiàn)到了這樣一個(gè)問題,類裝載器自身也是一個(gè)類,它也需要被裝載到內(nèi)存中來,那么這些類裝載器由誰來裝載呢,總得有個(gè)根吧?沒錯(cuò),確實(shí)存在這樣的根,它就是神龍見首不見尾的Bootstrap?ClassLoader.?為什么說它神龍見首不見尾呢,因?yàn)槟愀緹o法在Java代碼中抓住哪怕是它的一點(diǎn)點(diǎn)的尾巴,盡管你能時(shí)時(shí)刻刻體會(huì)到它的存在,因?yàn)閖ava的運(yùn)行環(huán)境所需要的所有類庫(kù),都由它來裝載,而它本身是C++寫的程序,可以獨(dú)立運(yùn)行,可以說是JVM的運(yùn)行起點(diǎn),偉大吧。在Bootstrap完成它的任務(wù)后,會(huì)生成一個(gè)AppClassLoader(實(shí)際上之前系統(tǒng)還會(huì)使用擴(kuò)展類裝載器ExtClassLoader,它用于裝載Java運(yùn)行環(huán)境擴(kuò)展包中的類),這個(gè)類裝載器才是我們經(jīng)常使用的,可以調(diào)用ClassLoader.getSystemClassLoader()?來獲得,我們假定程序中沒有使用類裝載器相關(guān)操作設(shè)定或者自定義新的類裝載器,那么我們編寫的所有java類通通會(huì)由它來裝載,值得尊敬吧。AppClassLoader查找類的區(qū)域就是耳熟能詳?shù)腃lasspath,也是初學(xué)者必須跨過的門檻,有沒有靈光一閃的感覺,我們按照它的類查找范圍給它取名為類路徑類裝載器。還是先前假定的情況,當(dāng)Java中出現(xiàn)新的類,AppClassLoader首先在類傳遞給它的父類類裝載器,也就是Extion?ClassLoader,詢問它是否能夠裝載該類,如果能,那AppClassLoader就不干這活了,同樣Extion?ClassLoader在裝載時(shí),也會(huì)先問問它的父類裝載器。我們可以看出類裝載器實(shí)際上是一個(gè)樹狀的結(jié)構(gòu)圖,每個(gè)類裝載器有自己的父親,類裝載器在裝載類時(shí),總是先讓自己的父類裝載器裝載(多么尊敬長(zhǎng)輩),如果父類裝載器無法裝載該類時(shí),自己就會(huì)動(dòng)手裝載,如果它也裝載不了,那么對(duì)不起,它會(huì)大喊一聲:Exception,class?not?found。有必要提一句,當(dāng)由直接使用類路徑裝載器裝載類失敗拋出的是NoClassDefFoundException異常。如果使用自定義的類裝載器loadClass方法或者ClassLoader的findSystemClass方法裝載類,如果你不去刻意改變,那么拋出的是ClassNotFoundException。

    類加載器是什么?

    Java和其他語言不同的是,Java是運(yùn)行于Java虛擬機(jī)(JVM)。這就意味著編譯后的代碼是以
    一種和平臺(tái)無關(guān)的格式保存的,而不是某種特定的機(jī)器上運(yùn)行的格式。這種格式和傳統(tǒng)的可
    執(zhí)行代碼格式有很多重要的區(qū)別。具體來說,不同于C或者C++程序,Java程序不是一個(gè)獨(dú)
    立的可執(zhí)行文件,而是由很多分開的類文件組成,每個(gè)類文件對(duì)應(yīng)一個(gè)Java類。 另外,這
    些類文件并不是馬上加載到內(nèi)存,而是當(dāng)程序需要的時(shí)候才加載。 類加載器就是Java虛擬
    機(jī)中用來把類加載到內(nèi)存的工具。而且,Java類加載器也是用Java實(shí)現(xiàn)的。這樣你就不需要
    對(duì)Java虛擬機(jī)有深入的理解就可以很容易創(chuàng)建自己的類加載器了。

    為什么要?jiǎng)?chuàng)建類加載器?

    既然Java虛擬金已經(jīng)有了類加載器,我們還要自己創(chuàng)建其他的呢?問得好。默認(rèn)的類加載器
    只知道如何從本地系統(tǒng)加載類。當(dāng)你的程序完全在本機(jī)編譯的話,默認(rèn)的類加載器一般都工
    作的很好。但是Java中最激動(dòng)人心的地方之一就是很容易的從網(wǎng)絡(luò)上而不只是本地加載類。
    舉個(gè)例子,瀏覽器可以通過自定義的類加載器加載類。 還有
    很多加載類的方式。除了簡(jiǎn)單的從本地或者網(wǎng)絡(luò)外,你還可以通過自定義Java中最激動(dòng)人心
    的地方之一:
    * 執(zhí)行非信任代碼前自動(dòng)驗(yàn)證數(shù)字簽名
    * 根據(jù)用戶提供的密碼解密代碼
    * 根據(jù)用戶的需要?jiǎng)討B(tài)的創(chuàng)建類
    你關(guān)心的任何東西都能方便的以字節(jié)碼的形式集成到你的應(yīng)用中

    -----------------------------------------------------------------------------------

    以上大都是別人的文字,我選取了一些保存下來。用于以后的繼續(xù)學(xué)習(xí)。

    如果哪位朋友研究過這方面的內(nèi)容,很樂意向您請(qǐng)教學(xué)習(xí)。



    歡迎來訪!^.^!
    本BLOG僅用于個(gè)人學(xué)習(xí)交流!
    目的在于記錄個(gè)人成長(zhǎng).
    所有文字均屬于個(gè)人理解.
    如有錯(cuò)誤,望多多指教!不勝感激!

    Feedback

    # re: java class loading技術(shù)研究  回復(fù)  更多評(píng)論   

    2007-03-26 09:52 by Tortoise
    不錯(cuò),很經(jīng)典

    Copyright © 久城

    主站蜘蛛池模板: a毛片全部免费播放| 成年私人影院免费视频网站 | 亚洲高清资源在线观看| 久视频精品免费观看99| 亚洲欧美日韩中文二区| 久久被窝电影亚洲爽爽爽| 和日本免费不卡在线v| 乱人伦中文视频在线观看免费| 亚洲AV无码1区2区久久| 免费观看一级毛片| 久久免费福利视频| 国产亚洲精品2021自在线| 亚洲AV区无码字幕中文色| 国产公开免费人成视频| 一级毛片免费观看不卡视频| 亚洲成a∧人片在线观看无码| 亚洲国产精品久久久天堂| 国产免费爽爽视频免费可以看| 日韩精品在线免费观看| 精品视频免费在线| 亚洲人成片在线观看| 国产AV无码专区亚洲AV手机麻豆| 免费毛片在线播放| 18级成人毛片免费观看| 在线观看免费视频网站色| 国产亚洲情侣久久精品| 亚洲国产成人在线视频| 亚洲人成网77777色在线播放| 免费真实播放国产乱子伦| 免费电视剧在线观看| 人妻无码一区二区三区免费 | 国产国产人免费人成成免视频| 亚洲精品亚洲人成在线播放| 久久精品国产亚洲AV网站| va亚洲va日韩不卡在线观看| 成年私人影院免费视频网站| 成年人网站免费视频| 久久国产高潮流白浆免费观看| WWW免费视频在线观看播放| 色视频在线观看免费| 久久久久久久久无码精品亚洲日韩|