Java之動態(tài)編譯磷醋,靜態(tài)編譯簡單理解和實例

開心一笑

【年底是各種案件的高發(fā)期猫牡,我們?nèi)TM取錢的時候,一定要注意遮擋邓线,不要被陌生人看到你的余額淌友,要不然啊,就骇陈,震庭,,非常容易被人嘲笑你雌。其實對于胖子來說器联,買衣服最簡單了,都不用進去。直接就在門口問一句:“老板主籍,有我能穿的衣服么”? 老板瞅了我一眼:“沒有”! 那我就毫不猶豫的走到下一家逛球。反正在胖子的眼里千元,衣服沒有好看不好看,只有能穿和不能穿颤绕! 】

唯美圖片.png

提出問題

java中的動態(tài)編譯和靜態(tài)編譯如何理解???

解決問題

1.概念

靜態(tài)編譯:一次性編譯幸海。在編譯的時候把你所有的模塊都編譯進去。

動態(tài)編譯:按需編譯奥务。程序在運行的時候物独,用到那個模塊就編譯哪個模塊。

2.實例

例一:

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/05.
 */
class Ay{
    public static void main(String[] args) {
        //如編譯后的Boy.class文件消失氯葬,會報錯誤:java.lang.NoClassDefFoundError
        Boy boy = new Boy();
        boy.sayHello();  
    }
}

class Boy implements Person{
    public void sayHello(){
        System.out.println("say hello .....");
    }
}

interface Person{
    void sayHello();
}

例二:

比如開發(fā)一個閱讀器挡篓,支持txt,pdf帚称,doc三種格式官研。我們把讀txt,讀pdf闯睹,讀doc定義為三個功能模塊戏羽。

靜態(tài)編譯:我想看個txt,點擊應用程序圖標以后楼吃,三個功能都加載進來了始花。在這里,另外兩個模塊的作用就是占用系統(tǒng)資源孩锡。

動態(tài)編譯:我想看個txt酷宵,點擊應用程序,判斷格式浮创,只加載讀txt模塊忧吟,使用讀txt模塊。斩披。溜族。
顯然,動態(tài)編譯1速度快垦沉,2節(jié)省了系統(tǒng)資源煌抒,3利于今后拓展。厕倍。寡壮。。。况既。这溅。。

例三:

把下面的例子拷貝到上面的main方法中:

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/05.
 */
public class Ay{
    public static void main(String[] args) {
        System.out.println("請輸入您要輸入的類的名字");  
        //輸入一個類的名字  
        java.util.Scanner sc = new java.util.Scanner(System.in);   
        String s = sc.next();  
        //加載這個類  
        Class c = Class.forName(s);  
        //獲得這個類的實例化對象  
        Object obj = c.newInstance();  
        //強制轉(zhuǎn)型  
        Person person = (Person)obj;  
        person.sayHello();
    }
    
}

我們把編譯文件Boy.class刪除棒仍,上面代碼編譯并未報錯悲靴。但是運行時候會出現(xiàn)NoClassDefFoundError異常,這時候我們用把刪除掉的Boy.class重新放回原處莫其,重新運行癞尚,這時候,代碼就可以正常運行乱陡。

這樣我們可以在不停止程序運行的情況下浇揩,動態(tài)地加載一個類。我認為這體現(xiàn)出了Java的動態(tài)性憨颠。通過上面的例子胳徽,我認為java語言是一種“半動態(tài)”性的語言。

3.最簡單的動態(tài)編譯例子

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/05.
 */
public class Ay{
    public static void main(String[] args) throws Exception{
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        int flag = compiler.run(null, null, null,"D:\\HelloWorld.java");
        System.out.println(flag == 0 ? "編譯成功" : "編譯失敗");
    }
}


/**
 * D盤放置的類的內(nèi)容
 * Created by HuangWenYi on 2017/1/6.
 */
public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

解釋一下:
第一個參數(shù):為java編譯器提供參數(shù)
第二個參數(shù):得到java編譯器的輸出信息
第三個參數(shù):接受編譯器的錯誤信息
第四個參數(shù):可變參數(shù)(是一個String數(shù)組)能傳入一個或多個java源文件
返回值:0表示編譯成功爽彤,非0表示編譯失敗

4.動態(tài)運行編譯好的類

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/05.
 */
public class Ay{
    public static void main(String[] args) throws Exception{
        //獲得系統(tǒng)的java編譯器
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        //編譯文件膜廊,編譯成功返回 0 否則 返回 1
        int flag = compiler.run(null, null, null,"D:\\HelloWorld.java");
        System.out.println(flag == 0 ? "編譯成功" : "編譯失敗");
        //指定class路徑,默認和源代碼路徑一致淫茵,加載class
        URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("file:/d:/")});
        Object printer = classLoader.loadClass("HelloWorld").newInstance();
        System.out.println(printer.toString());

    }
}

運行結果

編譯成功
HelloWorld@4c583ecf

5.慎用動態(tài)編譯

  • 在框架中謹慎使用
  • 不要在要求高性能的項目使用
    動態(tài)編譯畢竟需要一個編譯過程爪瓜,與靜態(tài)編譯相比多了一個執(zhí)行環(huán)節(jié),因此在高性能項目中不要使用動態(tài)編譯匙瘪。
  • 動態(tài)編譯要考慮安全問題
    它是非常典型的注入漏洞铆铆,只要上傳一個惡意Java程序就可以讓你所有的安全工作毀于一旦。
  • 記錄動態(tài)編譯過程
    建議記錄源文件丹喻、目標文件薄货、編譯過程、執(zhí)行過程等日志碍论,不僅僅是為了診斷谅猾,還是為了安全和審計,對Java項目來說鳍悠,空中編譯和運行是很不讓人放心的税娜,留下這些依據(jù)可以更好地優(yōu)化程序。

讀書感悟

來自電影《長城》

  • 人類和怪物的貪婪是沒有區(qū)別的藏研。
  • 你以后會證明你的勇敢敬矩。
  • 我苦練一生,只為此一戰(zhàn)蠢挡。

經(jīng)典故事

【哈佛一調(diào)查報告說弧岳,人生平均只有7次決定人生走向的機會凳忙,兩次機會間相隔約7年,大概25歲后開始出現(xiàn)禽炬,75歲以后就不會有什么機會了涧卵。這50年里的7次機會,第一次不易抓到腹尖,因為太年輕艺演;最后一次也不用抓,因為太老桐臊。這樣只剩5次,這里面又有兩次會不小心錯過晓殊,所以實際上只有3次機會了断凶。】

參考文章

【1】Java中的動態(tài)和靜態(tài)編譯
【2】動態(tài)編譯和靜態(tài)編譯及Java執(zhí)行
【3】動態(tài)生成java巫俺、動態(tài)編譯认烁、動態(tài)加載
【4】java筆記十一:動態(tài)編譯
【5】Java學習之-動態(tài)編譯-DynamicCompile_反射調(diào)用
【6】Java動態(tài)編譯
【7】編寫高質(zhì)量代碼:改善Java程序的151個建議

唯美圖片.png

其他

如果有帶給你一絲絲小快樂,就讓快樂繼續(xù)傳遞下去介汹,歡迎點贊却嗡、頂、歡迎留下寶貴的意見嘹承、多謝支持窗价!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叹卷,隨后出現(xiàn)的幾起案子撼港,更是在濱河造成了極大的恐慌,老刑警劉巖骤竹,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帝牡,死亡現(xiàn)場離奇詭異,居然都是意外死亡蒙揣,警方通過查閱死者的電腦和手機靶溜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懒震,“玉大人罩息,你說我怎么就攤上這事「鋈牛” “怎么了扣汪?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锨匆。 經(jīng)常有香客問我崭别,道長冬筒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任茅主,我火速辦了婚禮舞痰,結果婚禮上,老公的妹妹穿的比我還像新娘诀姚。我一直安慰自己响牛,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布赫段。 她就那樣靜靜地躺著呀打,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糯笙。 梳的紋絲不亂的頭發(fā)上贬丛,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音给涕,去河邊找鬼豺憔。 笑死,一個胖子當著我的面吹牛够庙,可吹牛的內(nèi)容都是我干的恭应。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼耘眨,長吁一口氣:“原來是場噩夢啊……” “哼昼榛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剔难,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤褒纲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钥飞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莺掠,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年读宙,在試婚紗的時候發(fā)現(xiàn)自己被綠了彻秆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡结闸,死狀恐怖唇兑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桦锄,我是刑警寧澤扎附,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站结耀,受9級特大地震影響留夜,放射性物質(zhì)發(fā)生泄漏匙铡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一碍粥、第九天 我趴在偏房一處隱蔽的房頂上張望鳖眼。 院中可真熱鬧,春花似錦嚼摩、人聲如沸钦讳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿卒。三九已至,卻和暖如春潮秘,著一層夾襖步出監(jiān)牢的瞬間琼开,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工唇跨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衬衬。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓买猖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滋尉。 傳聞我的和親對象是個殘疾皇子玉控,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法狮惜,內(nèi)部類的語法高诺,繼承相關的語法,異常的語法碾篡,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,517評論 25 707
  • 今天主要學習了MFC: 1.Windows程序的內(nèi)部運行原理 Windows程序設計是一種事件驅(qū)動的程序設計方法。...
    孫世龍閱讀 295評論 0 0
  • 請別責怪我太過投入。我只是一次偶爾間鸿秆,忘記了踏上歸途口四。天荒地老的傳說,終敵不過紅塵流轉(zhuǎn)十載暗啞的蹉跎
    劍仙裴宣閱讀 220評論 0 1