所谓动态编译,就是在程序运行时产生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();
int status = compiler.run(null, null, null, "-encoding", "UTF-8", "-classpath", javaAbsolutePath.toString(), javaAbsolutePath);
if(status!=0){
System.out.println("没有编译成功!");
}
}
@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命令
参考:
https://blog.csdn.net/zhoufanyang_china/article/details/82767406