所謂動態編譯,就是在程序運行時產生java類,並編譯成class文件。
在D盤test目錄下有兩個java文件:AlTest1.java、AlTest2.java,現需要通過java代碼實現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命令
參考資料: