动态运行Java代码

有些情况下,我们不得不动态运行Java代码,以便提供更加灵活的方式,以下代码可参考(在JDK 1.5+平台上运行通过):

	public static void main(String[] args) {
//		PrintWriter out;
//		PrintStream myOut = new PrintStream(out);
//		System.setOut(myOut);
//		System.setErr(myOut);

		int i = 10;
		String code = "System.out.println(\"Hello World!\"+(13+2*5/3));";
		code += "for(int i=0;i<" + i + ";i++){";
		code += " System.out.println(Math.pow(i,2));";
		code += "}";
		try {
			run(code);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private synchronized static File compile(String code) throws Exception {
		File file = File.createTempFile("JavaRuntime", ".java", new File(System
				.getProperty("user.dir")));
		file.deleteOnExit();

		//		获得类名 
		String classname = getBaseFileName(file);

		//		将代码输出到文件 
		PrintWriter out = new PrintWriter(new FileOutputStream(file));
		out.println(getClassCode(code, classname));
		out.close();

		//		编译生成的java文件 
		String[] cpargs = new String[] { "-d",
				System.getProperty("user.dir") + "\\WebRoot\\WEB-INF\\classes",
				file.getName() };
		int status = Main.compile(cpargs);
		if (status != 0) {
			throw new Exception("语法错误!");
		}

		return file;
	}

	private static synchronized void run(String code) throws Exception {
		String classname = getBaseFileName(compile(code));
		new File(System.getProperty("user.dir")
				+ "\\WebRoot\\WEB-INF\\classes\\" + classname + ".class")
				.deleteOnExit();
		try {
			Class cls = Class.forName(classname);
			Method main = cls.getMethod("method", null);
			main.invoke(cls, null);
		} catch (Exception se) {
			se.printStackTrace();
		}
	}

	private static String getClassCode(String code, String className) {
		StringBuffer text = new StringBuffer();

		text.append("public class " + className + "{\n");
		text.append(" public static void method(){\n");
		text.append(" " + code + "\n");
		text.append(" }\n");
		text.append("}");

		return text.toString();
	}

	private static String getBaseFileName(File file) {
		String fileName = file.getName();
		int index = fileName.indexOf(".");
		String result = "";
		if (index != -1) {
			result = fileName.substring(0, index);
		} else {
			result = fileName;
		}
		return result;
	}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值