package com.kenick.util; import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; /** * @ClassName EvalUtil * @Description TODO * @author kick * @date 2017年2月7日 下午3:18:16 */ public class EvalUtil { public static void eval(String code) throws Exception{ // 将待编译代码写入到临时java文件中 String javaFile = "d:/EvalUtilTemp.java"; File javaSourceFile = new File(javaFile); File javaClassFile = new File("d:/EvalUtilTemp.class"); if(!javaSourceFile.exists()){ javaSourceFile.createNewFile(); } FileOutputStream fileOutputStream = new FileOutputStream(javaSourceFile); String javaString = "public class EvalUtilTemp {"+ " public static void exec() {"+ code+ "}"+ "}"; fileOutputStream.write(javaString.getBytes()); fileOutputStream.close(); // 编译java代码 Process exec = Runtime.getRuntime().exec("javac "+ javaFile); exec.waitFor(); int exitValue = exec.exitValue(); if(exitValue==0){ System.out.println("编译成功!"); }else{ System.out.println("编译失败"); } // 加载Class文件 URL[] urls = {new URL("file:d:/")}; URLClassLoader urlClassLoader = new URLClassLoader(urls); Class<?> EvalUtilTemp = urlClassLoader.loadClass("EvalUtilTemp"); Method execMethod = EvalUtilTemp.getMethod("exec", null); System.out.println("开始执行如何代码:"); System.out.println(code); System.out.println("---------start----------"); Object ret = execMethod.invoke(null, null); System.out.println("---------end-----------"); if(ret !=null){ System.out.println("代码执行返回值为:"+ret); } //清理临时文件 if(javaSourceFile.exists()){ javaSourceFile.delete(); } if(javaClassFile.exists()){ javaClassFile.delete(); } } public static void main(String[] args) throws Exception { EvalUtil.eval("System.out.println(\"aa\");"); } }
程序执行结果: