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

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

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

    解決之道

    個人日記
    posts - 33, comments - 1, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    java class loading技術研究

    Posted on 2008-07-31 15:45 閱讀(171) 評論(0)  編輯  收藏

    最近在忙畢業設計,被分到的課題是 :java class loading技術研究

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

    一個類代表要執行的代碼,而數據則表示其相關狀態。狀態時常改變,而代碼則不會。當我們將一個特定的狀態與一個類相對應起來,也就意味著將實例化一個對象。盡管相同的類對應的實例的狀態千差萬別,但其本質都對應著同一段代碼。在JAVA中,一個類通常有著一個.class文件,但也有例外。

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

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

    流程:

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

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

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

    Java類裝載體系結構

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

    類加載器是什么?

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

    為什么要創建類加載器?

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

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

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

    如果哪位朋友研究過這方面的內容,很樂意向您請教學習。



    久城 2007-03-23 14:07 發表評論

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 在线观看日本免费a∨视频| 巨波霸乳在线永久免费视频| 国产女高清在线看免费观看| 亚洲午夜成人精品无码色欲| 麻豆一区二区免费播放网站| 亚洲国产成人精品无码区在线秒播 | 久久香蕉国产线看观看亚洲片| 一区二区三区视频免费观看| 亚洲精品国产综合久久一线| 一级毛片a女人刺激视频免费 | 国产成人免费一区二区三区| 国产成人亚洲毛片| 国产成人99久久亚洲综合精品| 东北美女野外bbwbbw免费| 中文字幕亚洲无线码a| 久久影视国产亚洲| 两个人的视频www免费| 亚洲欧洲日产国码无码网站 | 亚洲中文字幕久久精品蜜桃| 毛片a级毛片免费观看免下载| 久久精品国产大片免费观看| 精品国产人成亚洲区| a级黄色毛片免费播放视频| 亚洲综合自拍成人| 好爽…又高潮了免费毛片| 男女超爽视频免费播放| 中文字幕精品亚洲无线码一区| 久久青草免费91观看| 亚洲资源最新版在线观看| 四虎影视永久免费观看| 男的把j放进女人下面视频免费| 亚洲欧洲另类春色校园小说| 国产精品四虎在线观看免费| 久久高潮一级毛片免费| 亚洲a级在线观看| 亚洲精品A在线观看| 777成影片免费观看| 国产精品亚洲综合| 亚洲av中文无码乱人伦在线播放| 成人AV免费网址在线观看| 久久精品无码免费不卡|