通过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();
}
}
}