Java 动态编译--DynamicCompiler

java 动态编译自己写过程的机会比较少,记录一下: 

 1 package com.xzlf.dynamicCompile;
 2 
 3 import java.io.IOException;
 4 import java.lang.reflect.Method;
 5 import java.net.URL;
 6 import java.net.URLClassLoader;
 7 
 8 import javax.tools.JavaCompiler;
 9 import javax.tools.ToolProvider;
10 
11 /**
12  * java 动态性
13  * @author xzlf
14  *
15  */
16 public class Demo01 {
17     public static void main(String[] args) throws IOException {
18         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
19         int run = compiler.run(null, null, null, "f:/aa/temp/HelloWorld.java");
20         System.out.println(run == 0 ? "编译成功" : "编译失败");
21         /*
22         // 通过RunTime 调用执行器  启动新进程运行
23         Runtime runtime = Runtime.getRuntime();
24         Process process = runtime.exec("java -cp f:/aa/temp HelloWorld");
25         BufferedReader reader = new BufferedReader(
26                 new InputStreamReader(process.getInputStream()));
27         String info;
28         while((info = reader.readLine()) != null) {
29             System.out.println(info);
30         }
31         reader.close();
32         */
33         
34         // 通过反射运行编译好的类
35         try {
36             URL[] urls = new URL[] {new URL("file:/f:/aa/temp/")};
37             URLClassLoader loader = new URLClassLoader(urls);
38             Class<?> c = loader.loadClass("HelloWorld");
39             // 调用加载类的main方法
40             Method m = c.getMethod("main", String[].class);
41             m.invoke(null, (Object)new String[] {});
42             //由于可变参数是JDK5.0之后才有。
43             //m.invoke(null, (Object)new String[]{});会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
44             //因此,必须要加上(Object)转型,避免这个问题。
45             //public static void main(String[] args)
46             
47         } catch (Exception e) {
48             e.printStackTrace();
49         }
50         
51     }
52 }

运行测试:

 

posted @ 2020-04-11 23:37  行者老夫  阅读(615)  评论(0编辑  收藏  举报