Java Online Executor
Java Online Executor
最近一直在做LeetCode上的算法题,像这种在线编程网站都会提供一个在线编写,运行代码的窗口,如下图。
正好最近在看周志明老师的《深入理解Java虚拟机》这本书,在书中的第九章《类加载及执行子系统的案例与实战》中详细讲解了“如何实现远程执行功能”,与上述在线执行器的思路一致。
结合TangBean同学的OnlineExecutor项目,后续会完善多个相关功能:
使用javax.tools包可以实现Java源代码编译,优点如下:
要执行编译后的Java代码,让类加载器加载这个类生成一个Class对象,然后反射调用一下某个方法就可以了(因为不实现任何接口,我们可以借用一下Java中人人皆知的“main()”方法)。但我们还应该考虑到:一段程序往往不是编写、运行一次就能达到效果,同一个类可能要反复修改、提交、执行。还有,既然提交的是临时代码,那提交Java类在执行完后就应当能卸载和回收。
把程序往标准输出(System.out)和标准错误输出(System.err)中打印的信息收集起来,但标准输出设备是整个虚拟机进程全局共享的资源,如果使用System.setOut()/System.setErr()方法把输出流重定向到自己定义的PrintStream对象上固然可以收集输出信息,但也会对原有程序产生影响;会把其他线程向标准输出中打印的信息也收集了。虽然这些并不是不能解决的问题,不过为了达到完全不影响原程序的目的,我们可以采用另外一种办法,即直接在执行的类中把对System.out的符号引用替换为我们准备的PrintStream的符号引用。