在程序中编译其它 .java文件,可以使用JavaCompiler,从程序中调用Java编程语言编译器的接口。
在程序中启动 .class文件,可以使用反射实现。
例子:在程序中编译并且运行,一个简单的helloworld程序。
package lrj.annotation;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.net.URL;
import java.net.URLClassLoader;
/**
* 在Java程序中动态编译
*/
public class TestClass {
public static void main(String[] args) throws Exception {
//准备好要编译的文件的地址
String srcDistory = "D:/my_file/";//文件夹目录
String destFile="Hello.java";//文件名字
String dest = "Hello";//目标文件:省略后缀.class
//1.调用Java编程语言编译器的接口JavaCompiler
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//2.使用run方法开始编译
int result = compiler.run(null,
null,
null,
srcDistory+destFile);
System.out.println(result==0?"编译成功":"编译失败");
//通过反射运行此文件
try{
URL[] urls = new URL[]{new URL("file:/"+srcDistory)};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass(dest);
//加载main方法并调用。静态方法可以不指定对象,invcke第一个参数为null。
c.getMethod("main",String[].class).invoke(null,(Object)new String[]{});
}catch (Exception e){
e.printStackTrace();
}
}
}
运行结果: