动态编译java程序实例

2005-07-01   作者:佚名   来源:本站整理   浏览:10249   评论:0
import java.io.*;
import java.lang.reflect.Method;
import com.sun.tools.javac.*;

public class RuntimeCode {

   private static Main javac = new Main();
/**等待用戶輸入JavaCode,然後編譯、執行*/
   public static void main(String[] args) throws Exception {
       String code = "";
       DataInputStream bd = new DataInputStream(System.in);
       byte[] brray= new byte[200];
       int i = bd.read(brray);
       code = new String(brray,0,i);
       run(compile(code));
       System.out.print(code);

   }
/**編譯JavaCode,返回暫存檔案物件*/
   private synchronized static File compile(String code) throws Exception {
       File file;
       //在用戶當前文件目錄創建一個臨時代碼文件
       file = File.createTempFile("JavaRuntime", ".java", new File(System.getProperty("user.dir")));
       System.out.println(System.getProperty("user.dir"));
       //當虛擬機退出時,刪除此臨時java原始檔案
       //file.deleteOnExit();
       //獲得檔案名和類名字
       String filename = file.getName();
       String classname = getClassName(filename);
       //將代碼輸出到文件
       PrintWriter out = new PrintWriter(new FileOutputStream(file));
       //        out.println("/**");
       out.write("class "+classname+"{"+"public static void main(String[] args)"+"{");
       out.write(code);
       out.write("}}");
       //關閉文件流
       out.flush();
       out.close();
       String[] args = new String[] { "-d", System.getProperty("user.dir"),filename };
       //返回編譯的狀態代碼
       int status = javac.compile(args);
       System.out.println(status);
       return file;
   }
//運行程序
   private static synchronized void run(File file) throws Exception {
       String filename = file.getName();
       String classname = getClassName(filename);
       //當虛擬機退出時,刪除此臨時編譯的類文件
       new File(file.getParent(),classname + ".class").deleteOnExit();
       try {
           Class cls = Class.forName(classname);
           //映射main方法
           Method main = cls.getMethod("main", new Class[] { String[].class });
           //執行main方法
           main.invoke(null, new Object[] { new String[0] });
       } catch (SecurityException se) {
       }
   }
   
   private static void debug(String msg) {
       System.err.println(msg);
   }
   
   private static String getClassName(String filename) {
       return filename.substring(0, filename.length() - 5);
   }
}

Tags:责任编辑:cvery
顶一下(58)
87.88%

网友评论已有 0 人参与评论  

请自觉遵守互联网相关政策法规,评论内容只代表网友观点,与本站立场无关!
  验证码:     登录   注册