java实现动态编译的几种方法

匿名 (未验证) 提交于 2019-12-02 20:41:15
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoufanyang_china/article/details/82766825

所谓动态编译,就是在程序运行时产生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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!