java實現動態編譯的幾種方法
阿新 • • 發佈:2018-12-10
所謂動態編譯,就是在程式執行時產生java類,並編譯成class檔案。
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.piao.main.ApplicationAdmin; @RunWith(SpringJUnit4ClassRunner.class) @ComponentScan("com.piao") @SpringBootTest(classes = ApplicationAdmin.class) public class Compiler { @Test public void compiler1(){ String javaAbsolutePath = "D:/test/AlTest1.java"; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); compiler.run(null, null, null, "-encoding", "UTF-8", "-classpath", javaAbsolutePath.toString(), javaAbsolutePath); } @Test public void compiler2(){ String javaAbsolutePath = "D:/test/AlTest2.java"; try { Process process = Runtime.getRuntime().exec("javac -classpath D:/test/ " + javaAbsolutePath); InputStream errorStream = process.getErrorStream(); InputStreamReader inputStreamReader = new InputStreamReader(errorStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String line = null; while ((line=bufferedReader.readLine()) != null){ System.out.println(line); } int exitVal = process.waitFor(); System.out.println("Process exitValue: " + exitVal); } catch (Exception e) { e.printStackTrace(); } } }
執行後, D:\test 目錄會生成兩個class檔案
其中方法compiler1是使用jdk自帶的rt.jar中的javax.tools包提供的編譯器
方法compiler2是使用Runtime執行javac命令
參考資料: