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

本文介绍了一个使用Java实现的工具类EvalUtil,该工具能够将传入的字符串形式的Java代码进行动态编译并执行。具体流程包括创建临时Java文件、编译、加载Class文件及调用方法等步骤。
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\");");
    }
}
程序执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值