一、概念
应用场景:如在线评测系统,客户端编写代码,上传到服务器端编译运行;服务器动态加载某些类文件进行编译
/*** * */ package cn.sxt.jvm; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; public class Test_0418_DynamicCompiler { public static void main(String[] args) throws IOException { JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();//获得一个编译器 //参数含义(需要输入时从哪里输入,往哪里输出,错误时输出位置,要编译文件的路径) null代表控制台输入输出,正确编译返回0 int result=compiler.run(null, null, null, "F:/MyEclipse/WorkSpace/注解_反射_字节码_JVM/HelloWorld.java"); //System.out.println(result==0?"编译成功":"编译失败"); //将字符串进行编译,借助IO流,将字符串存成一个临时文件,再调用编译方法 String msg="public class HelloWorld{ public static void main(String[] args){System.out.println(\"你好!\");}}"; //3、通过Runtime执行相关的类 Runtime run =Runtime.getRuntime(); Process process=run.exec("java -cp F:/MyEclipse/WorkSpace/注解_反射_字节码_JVM HelloWorld"); InputStream in =process.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(in)); String info=""; while ( (info=reader.readLine() )!=null) { System.out.println(info); //把编译好的类输出 } } }