posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          讓 java 動態

          Posted on 2007-10-09 09:26 G_G 閱讀(1308) 評論(4)  編輯  收藏 所屬分類: Inspiration
          在 D2D 論壇中見
          一文標題 《在java中利用動態編譯實現eval》
          http://dev2dev.bea.com.cn/bbsdoc/20060724298.html
          雖然給出代碼不能運行 但標題的意思已經達到
          在此 我也不多說了
          在此完善下原作者的代碼 并使可運行來方便大家理解

          企圖說明:
          代碼的可用性是沒有的,但代碼向我們打開了一個使java動態編譯的一向大門
          有想法的程序員們。我們在此得到了什么?

          代碼說明:
          ??? 1.為了使用例子的方便 testJavac.java 是 Bean ( name , avg ) 也是 邏輯類 ( eval(string) )
          ??? 2.運行請在 classpath 加入 java\lib\tools.jar jar 包 (
          com.sun.tools.javac.Main )
          ??? 3.還是方便運行本例對 自己在什么 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();
          ???????????
          //動態編譯
          ???????????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;
          ???????????}
          ???????????
          //調用Temp的rt方法返回結果:
          ???????????ClassLoader?mc?=?this.getClass().getClassLoader();
          ???????????
          ???????????Class?clasz?
          =?mc.loadClass("Temp");

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

          }

          運行結果
          D:\javac>javac -classpath D:\java\lib\tools.jar;. testJavac.java

          D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getName
          劉凱毅
          //此時在當前目錄下你可以看到 多了一個 Temp.java 和 Temp.class 文件
          //再使用 CalssLoader.loadClass方法
          動態加載到運行環境中來
          //創建 動態? 加載 動態?? (java 動起來了)
          D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getAvg
          24



          評論

          # re: 讓 java 動態   回復  更多評論   

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

          # re: 讓 java 動態   回復  更多評論   

          2007-10-09 22:29 by Unmi
          這種方法太過于原始,至少弄個像內存中編譯加載執行
          或者用 ASM,CGLIB,aspectj來修過字節碼的也行,再就是參考BSH的實現看看。
          JDK6已經提供了動態腳本支持。

          # re: 讓 java 動態   回復  更多評論   

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

          # re: 讓 java 動態   回復  更多評論   

          2008-05-19 18:44 by afaf
          不過 還有更好的 方法 用 Ruby
          主站蜘蛛池模板: 松江区| 南昌县| 龙胜| 上虞市| 株洲市| 西藏| 丽江市| 错那县| 德昌县| 老河口市| 神木县| 南岸区| 丰县| 阿拉善右旗| 治多县| 安陆市| 寿阳县| 田阳县| 阜新市| 秀山| 偃师市| 南皮县| 武鸣县| 阿拉尔市| 东源县| 洛隆县| 花莲县| 安远县| 驻马店市| 富川| 读书| 浑源县| 伊金霍洛旗| 马山县| 喜德县| 青岛市| 星子县| 秀山| 礼泉县| 汉源县| 上饶市|