JavaCompiler编译源代码并通过java反射执行(Hello World)


通过Java Api的JavaCompiler方法编译Hello World源代码,生成class文件,并通过java 反射机制执行Hello Word 源代码的Main方法

Hello World
package compiler;

/**
 * @author :  freedom
 * @Description :  TODO
 * @Creation Date:  2019-11-03 3:01 下午
 */
public class HelloWord {

  public static void main(String[] args) {
    System.out.println("Hello World!");
  }

}

JavaCompiler 测试类
package compiler;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

/**
 * @author :  freedom
 * @Description :  TODO
 * @Creation Date:  2019-11-03 3:02 下午
 */
public class JavaCompilerDemo {

  public static void main(String[] args) {
    //获得一个编译器
    JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
    //获得一个源码文件管理器
    StandardJavaFileManager standardJavaFileManager = javaCompiler
        .getStandardFileManager(null, null, null);
    File file = new File("/Volumes/work/project/java/proxyPattern/src/compiler/HelloWord.java");
    //获得源码文件对象
    Iterable<? extends JavaFileObject> javaFileObjects = standardJavaFileManager
        .getJavaFileObjects(file);
    //生成编译任务
    CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, null,
        null, null, javaFileObjects);
    //执行编译任务
    boolean compileFlag = task.call();
    if (!compileFlag) {
      System.out.println("编译失败");
    } else {
      //动态执行 (反射执行)
      System.out.println("编译成功");
      try {
        //获取编译好的文件
        URL[] urls = new URL[]{
            new URL("file:/Volumes/work/project/java/proxyPattern/src/compiler/HelloWord.class")};
        //获取URLClassLoader
        URLClassLoader classLoader = new URLClassLoader(urls);
        //获取clazz对象
        Class clazz = classLoader.loadClass("compiler.HelloWord");
        //通过反射根据方法名称和参数,获取指定的Method
        Method method = clazz.getDeclaredMethod("main", String[].class);
        String[] arguments = {null};
        //通过反射执行Method
        method.invoke(clazz, arguments);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    try {
      standardJavaFileManager.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bigdatafreedom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值