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

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

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

    posts - 165, comments - 198, trackbacks - 0, articles - 1
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    讓 java 動(dòng)態(tài)

    Posted on 2007-10-09 09:26 G_G 閱讀(1316) 評(píng)論(4)  編輯  收藏 所屬分類: Inspiration
    在 D2D 論壇中見
    一文標(biāo)題 《在java中利用動(dòng)態(tài)編譯實(shí)現(xiàn)eval》
    http://dev2dev.bea.com.cn/bbsdoc/20060724298.html
    雖然給出代碼不能運(yùn)行 但標(biāo)題的意思已經(jīng)達(dá)到
    在此 我也不多說(shuō)了
    在此完善下原作者的代碼 并使可運(yùn)行來(lái)方便大家理解

    企圖說(shuō)明:
    代碼的可用性是沒有的,但代碼向我們打開了一個(gè)使java動(dòng)態(tài)編譯的一向大門
    有想法的程序員們。我們?cè)诖说玫搅耸裁矗?br />

    代碼說(shuō)明:
    ??? 1.為了使用例子的方便 testJavac.java 是 Bean ( name , avg ) 也是 邏輯類 ( eval(string) )
    ??? 2.運(yùn)行請(qǐng)?jiān)?classpath 加入 java\lib\tools.jar jar 包 (
    com.sun.tools.javac.Main )
    ??? 3.還是方便運(yùn)行本例對(duì) 自己在什么 path 并不在意 類中使用了 System.getProperty("user.dir")

    import?java.io.File;
    import?java.io.FileWriter;
    import?java.io.PrintWriter;
    import?java.lang.reflect.Method;

    import?com.sun.tools.javac.Main;


    public?class?testJavac{
    ????????
    public?String?getName(){
    ???????????
    return?"劉凱毅";
    ????????}
    ????????
    public?int?getAvg(){
    ???????????
    return?24;
    ????????}
    ????????
    ????????
    public?Object?eval(String?str)throws?Exception{
    ???????????
    //生成java文件
    ????????String?s?=?"class?Temp{";
    ????????????s?
    +=?"private?testJavac?tj?=?new?testJavac();";
    ????????????s?
    +=?"public?String?rt(){";
    ????????????s?
    +=?"?return??\"\"+tj."+str+"();"??;
    ????????????s?
    +=?"}";
    ????????????s?
    +="}";
    ????????????
    ???????????File?f?
    =?new?File(System.getProperty("user.dir")+"\\Temp.java");
    ???????????PrintWriter?pw?
    =?new?PrintWriter(new?FileWriter(f));
    ???????????pw.println(s);
    ???????????pw.close();
    ???????????
    //動(dòng)態(tài)編譯
    ???????????Main?javac?=?new?Main();
    ???????????String[]?cpargs?
    =?new?String[]?{"-d",?System.getProperty("user.dir")?,"Temp.java"};
    ???????????
    int?status?=?javac.compile(cpargs);
    ???????????
    if(status!=0){
    ??????????????System.out.println(
    "沒有成功編譯源文件!");
    ??????????????
    return?null;
    ???????????}
    ???????????
    //調(diào)用Temp的rt方法返回結(jié)果:
    ???????????ClassLoader?mc?=?this.getClass().getClassLoader();
    ???????????
    ???????????Class?clasz?
    =?mc.loadClass("Temp");

    ???????????Method?rt?
    =?clasz.getMethod("rt",?new?Class[]{});
    ???????????
    return?rt.invoke(clasz.newInstance(),?new?Object[]?{?});
    ???????????
    //如果方法沒有返回就直接調(diào)用
    ????????}
    ????????
    ????????
    ????
    public?static?void?main(String[]args)throws?Exception{
    ????????testJavac?jj?
    =?new?testJavac();
    ????????System.out.println(?jj.eval(args[
    0])?);
    ????}

    }

    運(yùn)行結(jié)果
    D:\javac>javac -classpath D:\java\lib\tools.jar;. testJavac.java

    D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getName
    劉凱毅
    //此時(shí)在當(dāng)前目錄下你可以看到 多了一個(gè) Temp.java 和 Temp.class 文件
    //再使用 CalssLoader.loadClass方法
    動(dòng)態(tài)加載到運(yùn)行環(huán)境中來(lái)
    //創(chuàng)建 動(dòng)態(tài)? 加載 動(dòng)態(tài)?? (java 動(dòng)起來(lái)了)
    D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getAvg
    24



    評(píng)論

    # re: 讓 java 動(dòng)態(tài)   回復(fù)  更多評(píng)論   

    2007-10-09 14:41 by KF.咖啡
    沒有看懂

    # re: 讓 java 動(dòng)態(tài)   回復(fù)  更多評(píng)論   

    2007-10-09 22:29 by Unmi
    這種方法太過(guò)于原始,至少弄個(gè)像內(nèi)存中編譯加載執(zhí)行
    或者用 ASM,CGLIB,aspectj來(lái)修過(guò)字節(jié)碼的也行,再就是參考BSH的實(shí)現(xiàn)看看。
    JDK6已經(jīng)提供了動(dòng)態(tài)腳本支持。

    # re: 讓 java 動(dòng)態(tài)   回復(fù)  更多評(píng)論   

    2007-10-10 09:28 by G_G
    @Unmi
    謝謝提醒

    # re: 讓 java 動(dòng)態(tài)   回復(fù)  更多評(píng)論   

    2008-05-19 18:44 by afaf
    不過(guò) 還有更好的 方法 用 Ruby
    主站蜘蛛池模板: 久久久久亚洲AV片无码下载蜜桃| 日韩在线视频播放免费视频完整版 | 激情亚洲一区国产精品| 国产成人人综合亚洲欧美丁香花 | 亚洲人成色7777在线观看| 亚洲一区二区电影| 国产尤物在线视精品在亚洲| 在线观看免费黄色网址| 最近免费中文字幕4| 国产亚洲精品无码专区| 亚洲大片免费观看| 巨胸喷奶水视频www免费视频| 国产人在线成免费视频| 国产成人精品日本亚洲专一区| 中文字幕av无码不卡免费| 成人性生免费视频| 亚洲国产成人久久三区| 久久久久久久久久免免费精品| 天天影院成人免费观看| 亚洲人成在线电影| A级毛片成人网站免费看| 免费在线观看理论片| 亚洲av永久无码精品天堂久久| 久久久国产精品福利免费| 又黄又大又爽免费视频| 99热亚洲色精品国产88| 亚洲成人免费电影| 国产成人精品日本亚洲18图| 性xxxx视频免费播放直播| 亚洲伊人久久综合中文成人网| 日本免费精品一区二区三区| 国产又粗又长又硬免费视频| 亚洲欧美日韩一区二区三区在线| 久久国产免费福利永久| 亚洲啪啪免费视频| 亚洲18在线天美| 搡女人真爽免费视频大全| 国产精品亚洲AV三区| 中文字幕日韩亚洲| 美丽姑娘免费观看在线观看中文版| 亚洲无删减国产精品一区|