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 }
运行测试: