eval( )方法动态运行一行或多行程序代码。

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\");");
    }
}
程序执行结果:
 

猜你喜欢

转载自blog.csdn.net/leadseczgw01/article/details/54912143