亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        深入研究Java的類加載機(jī)制

        2010-03-22 22:44:09張洪波
        關(guān)鍵詞:定義程序動(dòng)作

        趙 宇,張洪波

        (唐山師范學(xué)院 計(jì)算機(jī)科學(xué)系,河北 唐山 063000)

        在許多傳統(tǒng)語言中,程序是作為啟動(dòng)(startup)過程的一部分立刻被加載的。然后是初始化,緊接著程序開始運(yùn)行。這些語言的初始化過程必須小心控制,以確保static的初始化順序不會(huì)造成麻煩。例如,如果某個(gè)static在另一個(gè)static被初始化之前就可以被有效地使用,那么 C++就會(huì)出現(xiàn)問題。Java就不會(huì)出現(xiàn)這個(gè)問題,因?yàn)樗捎昧艘环N不同的加載方式。由于 Java中的所有事物都是對象,所以許多動(dòng)作就變得更加容易,加載動(dòng)作僅僅是其中之一。每個(gè)類的編譯代碼都存在于它自己的獨(dú)立的文件中。

        一般來說,“類的代碼在初次使用時(shí)才加載”這通常是指知道類的第一個(gè)對象被構(gòu)建時(shí)才發(fā)生加載,但是當(dāng)訪問static數(shù)據(jù)成員或是static方法時(shí),也會(huì)發(fā)生加載。初次使用之處也是靜態(tài)初始化(static初始化)發(fā)生之處。所有的static對象和static代碼段都會(huì)在加載時(shí)依程序中的順序(即定義類時(shí)的書寫順序)依次初始化。當(dāng)然,static只會(huì)被初始化一次。

        Java語言是一種具有動(dòng)態(tài)性的解釋型編程語言,當(dāng)指定程序運(yùn)行的時(shí)候,Java虛擬機(jī)就將編譯生成的.class文件按照需求和一定的規(guī)則加載進(jìn)內(nèi)存,并組織成為一個(gè)完整的Java應(yīng)用程序。Java語言把每個(gè)單獨(dú)的類 Class和接口Implements編譯成單獨(dú)的一個(gè).class文件,這些文件對于Java運(yùn)行環(huán)境來說就是一個(gè)個(gè)可以動(dòng)態(tài)加載的單元,這些文件只在需要使用程序代碼時(shí)才會(huì)被加載。正是因?yàn)?Java的這種特性,我們可以在不重新編譯其它代碼的情況下,只編譯需要修改的單元,并把修改文件編譯后的.class文件放到Java的路徑當(dāng)中,等到下次該 Java虛擬機(jī)器重新激活時(shí),這個(gè)邏輯上的 Java應(yīng)用程序就會(huì)因?yàn)榧虞d了新修改的.class文件,自己的功能也做了更新,這就是Java的動(dòng)態(tài)性。

        1 預(yù)先加載與依需求加載

        Java運(yùn)行環(huán)境為了優(yōu)化系統(tǒng),提高程序的執(zhí)行速度,在JRE運(yùn)行的開始會(huì)將 Java運(yùn)行所需要的基本類采用預(yù)先加載(pre-loading)的方法全部加載要內(nèi)存當(dāng)中,因?yàn)檫@些單元在Java程序運(yùn)行的過程當(dāng)中經(jīng)常要使用的,主要包括JRE的rt.jar文件里面所有的.class文件。

        當(dāng)java.exe虛擬機(jī)開始運(yùn)行以后,它會(huì)找到安裝在機(jī)器上的JRE環(huán)境,然后把控制權(quán)交給JRE,JRE的類加載器會(huì)將lib目錄下的rt.jar基礎(chǔ)類別文件庫加載進(jìn)內(nèi)存,這些文件是 Java程序執(zhí)行所必須的,所以系統(tǒng)在開始就將這些文件加載,避免以后的多次IO操作,從而提高程序執(zhí)行效率。

        相對于預(yù)先加載,在程序中需要使用自己定義的類的時(shí)候就要使用依需求加載方法(load-on-demand),就是在Java程序需要用到的時(shí)候再加載,以減少內(nèi)存的消耗,因?yàn)镴ava語言的設(shè)計(jì)初衷就是面向嵌入式領(lǐng)域的。

        2 隱式加載和顯示加載

        Java的加載方式分為隱式加載(implicit)和顯示加載(explicit),上面的例子中就是用的隱式加載的方式。所謂隱式加載就是在程序中用new關(guān)鍵字來定義一個(gè)實(shí)例變量,JRE在執(zhí)行到 new關(guān)鍵字的時(shí)候就會(huì)把對應(yīng)的實(shí)例類加載進(jìn)入內(nèi)存。隱式加載的方法很常見,用的也很多,JRE系統(tǒng)在后臺(tái)自動(dòng)的幫助用戶加載,減少了用戶的工作量,也增加了系統(tǒng)的安全性和程序的可讀性。

        相對于隱式加載的就是不經(jīng)常用到的顯示加載。所謂顯示加載就是有程序員自己寫程序把需要的類加載到內(nèi)存當(dāng)中,如下程序代碼所示:

        class TestClass{

        public void method(){

        System.out.println("TestClass-method");

        }

        }

        public class CLTest{

        public static void main(Stringargs[]){

        try{

        Classc=Class.forName("TestClass");

        TestClassobject=(TestClass)c.newInstance();object.method();

        }catch(Exceptione){

        e.printStackTrace();

        }

        }

        }

        通過 Class類的 forName(Strings)方法把自定義類TestClass加載進(jìn)來,并通過 newInstance()方法把實(shí)例初始化。Class的 forName()方法還有另外一種形式:ClassforName(String s,Boolean flag,ClassLoader classloader),s表示需要加載類的名稱,flag表示在調(diào)用該函數(shù)加載類的時(shí)候是否初始化靜態(tài)區(qū),classloader表示加載該類所需的加載器。

        forName(String s)是默認(rèn)通過

        ClassLoader.getCallerClassLoader()調(diào)用類加載器的,但是該方法是私有方法,我們無法調(diào)用,如果我們想使用

        ClassforName(String s,Boolean flag,ClassLoader classloader)來加載類的話,就必須要指定類加載器,可以通過如下的方式來實(shí)現(xiàn):

        Tes ttest=new Test();//Test類為自定義的一個(gè)測試類;

        ClassLoader cl=test.getClass().getClassLoader();

        //獲取test的類裝載器;

        Classc=Class.forName("TestClass",true,cl);

        因?yàn)橐粋€(gè)類要加載就必需要有加載器,這里我們是通過獲取加載Test類的加載器cl當(dāng)作加載TestClass的類加載器來實(shí)現(xiàn)加載的。

        3 自定義類加載機(jī)制

        之前兩種類加載方式都是調(diào)用系統(tǒng)的類加載器來實(shí)現(xiàn)加載的,其實(shí)也可以由程序員自己定義類加載器的。利用Java提供的java.net.URLClassLoader類就可以實(shí)現(xiàn),代碼如下:

        try{

        URLurl=newURL("file:/d:/test/lib/");

        URLClassLoaderurlCL=newURLClassLoader(newURL[]{url});

        Classc=urlCL.loadClass("TestClassA");

        TestClassAobject=(TestClassA)c.newInstance();object.method();

        }catch(Exceptione){e.printStackTrace();}

        通過自定義的類加載器實(shí)現(xiàn)了 TestClassA類的加載并調(diào)用method()方法。分析一下這個(gè)程序:首先定義URL指定類加載器從何處加載類,URL可以指向網(wǎng)際網(wǎng)絡(luò)上的任何位置,也可以指向計(jì)算機(jī)里的文件系統(tǒng)(包含JAR文件)。上述范例當(dāng)中是從 file:/d:/test/lib/處尋找類;然后定義URLClassLoader來加載所需的類,最后即可使用該實(shí)例了。

        4 類加載器的階層體系

        當(dāng)執(zhí)行java***.class的時(shí)候,java.exe會(huì)找到JRE,接著找到位于JRE內(nèi)部的jvm.dll,這才是真正的Java虛擬機(jī)器,最后加載動(dòng)態(tài)庫,激活Java虛擬機(jī)器。虛擬機(jī)器激活以后,會(huì)先做一些初始化的動(dòng)作,比如說讀取系統(tǒng)參數(shù)等。一旦初始化動(dòng)作完成之后,就會(huì)產(chǎn)生第一個(gè)類加載器―BootstrapLoader,BootstrapLoader是由 C++所撰寫而成,這個(gè)BootstrapLoader所做的初始工作中,除了一些基本的初始化動(dòng)作之外,最重要的就是加載Launcher.java之中的ExtClassLoader,并設(shè)定其 Parent為null,代表其父加載器為 BootstrapLoader。然后 BootstrapLoader再要求加載 Laun- cher.java之中的AppClassLoader,并設(shè)定其 Parent為之前產(chǎn)生的ExtClassLoader實(shí)體。這兩個(gè)加載器都是以靜態(tài)類的形式存在的。這里要需要注意的是,Launcher$ExtClass- Loader.-class與Launcher$AppClassLoader.class都是由Boot- strapLoader所加載,所以Parent和由哪個(gè)類加載器加載沒有關(guān)系。

        猜你喜歡
        定義程序動(dòng)作
        試論我國未決羈押程序的立法完善
        動(dòng)作描寫要具體
        “程序猿”的生活什么樣
        畫動(dòng)作
        英國與歐盟正式啟動(dòng)“離婚”程序程序
        動(dòng)作描寫不可少
        成功的定義
        山東青年(2016年1期)2016-02-28 14:25:25
        創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
        非同一般的吃飯動(dòng)作
        修辭學(xué)的重大定義
        欧美日韩一区二区综合 | 精品午夜中文字幕熟女| 两人前一后地插着她丰满| 狠狠人妻久久久久久综合蜜桃| 亚洲av成人综合网| 亚洲AV手机专区久久精品| 国产69精品麻豆久久| 精品国产第一国产综合精品| 破了亲妺妺的处免费视频国产| 亚洲欧美日韩精品香蕉| 亚洲男同免费视频网站| 成人无码av一区二区| 亚洲黄色电影| 91久久精品国产性色tv| 亚洲av五月天一区二区| 熟女无套内射线观56| 国产精品爆乳在线播放 | 中文字幕精品无码一区二区| 51看片免费视频在观看| 老熟女毛茸茸浓毛| 放荡人妻一区二区三区| 日韩精品极品免费视频观看 | 蜜桃av噜噜一区二区三区| 精品亚洲一区二区99| 一本之道日本熟妇人妻| 久久精品夜色国产亚洲av| 国产亚洲日韩欧美久久一区二区| 日韩精品国产一区二区| 国内久久婷婷六月综合欲色啪| 欧洲女人性开放免费网站| 在线观看网址你懂的| 免费看黄片视频在线观看| 国产激情一区二区三区| 国内精品久久久久久无码不卡 | 国产成人精选在线不卡| 久久老熟女乱色一区二区| 98色婷婷在线| 乱码午夜-极品国产内射| 蜜桃一区二区三区自拍视频| 青青草在线免费视频播放| 天天燥日日燥|