程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 動態編譯java程序實例

動態編譯java程序實例

編輯:關於JAVA

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);

}

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved