第三篇 java的动态编译
动态编译的应用场景:
可以做一个在浏览器端编写java代码,上传服务器编译和运行的在线评测系统
服务器动态加载某些类文件进行编译
动态编译的两种做法:
通过runtime调用javac,启动新的进程去操作
Runtime run = Runtime.getRuntime();
Process process = run.exec("javac -cp d:/myjava/Hello.java");
1 public class Demo02 { 2 public static void main(String[] args) throws IOException { 3 //通过IO流操作,将字符串存储为一个临时文件(hi.java),然后调用动态编译方法 4 String str = "public class hi{public static void main(String[] args){" 5 + "System.out.println('hi')}}"; 6 //动态编译 7 JavaCompiler JavaCompiler = ToolProvider.getSystemJavaCompiler(); 8 //sourceFile文件的路径 9 int result = JavaCompiler.run(null, null, null, "c:/java/Hello.java"); 10 System.out.println(result == 0?"编译成功":"编译失败"); 11 12 Runtime run = Runtime.getRuntime(); 13 Process process = run.exec("javac -cp c:/java Hello.java"); 14 InputStream in = process.getInputStream(); 15 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 16 String info = reader.readLine(); 17 while(info != null){ 18 System.out.println(info); 19 } 20 } 21 }
通过javaCompiler动态编译
1 public static int compileFile(String sourceFile){ 2 //动态编译 3 JavaCompiler JavaCompiler = ToolProvider.getSystemJavaCompiler(); 4 int result = JavaCompiler.run(null, null, null, sourceFile); 5 System.out.println(result == 0?"编译成功":"编译失败"); 6 return result; 7 }
第一个参数:为java编译器提供参数
第二个参数:得到java编译器的输出信息
第三个参数:接收编译器的错误信息
第四个参数:可变参数(是一个string数组)能传入一个或者多个源文件
返回值:0表示编译成功,非0表示编译失败
通过反射进行动态编译
1 public class Demo02 { 2 public static void main(String[] args) throws Exception { 3 //通过IO流操作,将字符串存储为一个临时文件(hi.java),然后调用动态编译方法 4 String str = "public class hi{public static void main(String[] args){" 5 + "System.out.println('hi')}}"; 6 //动态编译 7 JavaCompiler JavaCompiler = ToolProvider.getSystemJavaCompiler(); 8 //sourceFile文件的路径 9 int result = JavaCompiler.run(null, null, null, "c:/java/Hello.java"); 10 System.out.println(result == 0?"编译成功":"编译失败"); 11 12 //通过runtime调用类 13 /*Runtime run = Runtime.getRuntime(); 14 Process process = run.exec("javac -cp c:/java Hello.java"); 15 InputStream in = process.getInputStream(); 16 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 17 String info = reader.readLine(); 18 while(info != null){ 19 System.out.println(info); 20 }*/ 21 URL[] urls = new URL[]{ 22 new URL("file:/"+"c:/java/") 23 }; 24 URLClassLoader loader = new URLClassLoader(urls); 25 Class c = loader.loadClass("Hello"); 26 //调用加载类的main方法 27 Method method = c.getMethod("main", String[].class); 28 //参数的个数是可以变的,加object进行转型 29 method.invoke(null,(Object)new String[]{}); 30 } 31 }