java實現動態編譯的幾種方法

所謂動態編譯,就是在程序運行時產生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命令

 

 

 

 

 

 

 

 

 

 

 

 

參考資料:

https://www.cnblogs.com/anai/p/4269858.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章