Posted on 2007-10-09 09:26
G_G 閱讀(1306)
評(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á)到
在此 我也不多說了
在此完善下原作者的代碼 并使可運(yùn)行來方便大家理解
企圖說明:
代碼的可用性是沒有的,但代碼向我們打開了一個(gè)使java動(dòng)態(tài)編譯的一向大門
有想法的程序員們。我們?cè)诖说玫搅耸裁矗?br />
代碼說明:
??? 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)境中來
//創(chuàng)建 動(dòng)態(tài)? 加載 動(dòng)態(tài)?? (java 動(dòng)起來了)
D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getAvg
24