Java使用程式碼進行編譯與執行
阿新 • • 發佈:2019-01-06
package com.java.basic.compiler; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class CompilerTest { public static void main(String[] args) throws IOException { /** * 1. 編譯程式碼 * 2. 執行程式碼 * 3. 執行緒互動, 獲取輸入流(執行結果) */ // 程式碼編譯 JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); int count = javaCompiler.run(null, null, null, "D:/new~dir/project-student/CompilerSource.java"); System.out.println(count == 0 ? "編譯成功": "編譯失敗"); // 程式碼執行 Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("java -cp D:/new~dir/project-student/ CompilerSource"); InputStream in = process.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String inS = ""; while ((inS=reader.readLine()) != null) { System.out.println(inS); } } }
package com.java.basic.compiler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; public class ReflectTest { public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { /** * 1. 載入類進jvm, 獲取位元組碼物件 * 2. 使用反射呼叫該方法 */ URL[] urls = new URL[]{new URL("file:/D:/new~dir/project-student/")}; URLClassLoader loader = new URLClassLoader(urls); Class c = loader.loadClass("CompilerSource"); Method m = c.getMethod("main", String[].class); m.invoke(null,(Object)new String[]{"a","b"}); } }