【Online Jedge】1.动态编译

本文介绍了如何在在线判题系统中实现Java动态编译。首先回顾了基于cmd的编译方式及其局限性,然后通过JavaCompiler接口进行动态编译,探讨了JavaFileObject的使用,包括ForwardingJavaFileObject和SimpleJavaFileObject,以及在实际操作中遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

写在前面

又是一年毕业季。

毕业设计选题的时候一时兴起选了 Online Jedge 系统的设计与实现,但是,理想是丰满的,现实是骨感的,本人的技术不到位啊~

当初想得挺简单的:一个安全编译,一个线程池,一个消息队列,一个前后端交互。现在回想起来…

虽然说有些难度,但是定下来的东西总得去完成吧,我做事喜欢按照自己的思路来。

既然有代码提交过来,如果想要执行,按照Java语言的特性,那就得先编译


基于cmd的方式

记得一开始学Java的时候,安装完jdk后会在cmd控制台中输入 JavaJavac 命令来测试环境是否安装成功。其中 java classname 可以执行一个class文件, javac demod.java 则是启动Java编译器对已有的Java文件进行编译。

public static void test() {
   
		Scanner ins = new Scanner(System.in);
		Runtime runtime = Runtime.getRuntime();
		Process P;
		while (true) {
   
			try {
   
				P = runtime.exec("cmd /c "+ins.nextLine());
				//获取输入流
				BufferedReader input = new BufferedReader(new InputStreamReader(P.getInputStream()));
				//获取错误流
				BufferedReader err = new BufferedReader(new InputStreamReader(P.getErrorStream()));
				
				for (String line = input.readLine(); line != null; line = input.readLine())
					System.out.println(line);
				
				for (String line = err.readLine(); line != null; line = err.readLine())
					System.out.println(line);
				
			} catch (IOException e) {
   
				System.out.println("error");
			}
		}
	}

主要的原理是利用 Runtime 去执行cmd命令
但是这种方式有一个很致命的缺点:程序是由系统另外开启一个进程来执行的,不可控!

cmd编译,反射执行

基于上面的方法,我想出了一个补救方案

在这里我们先回顾一下类的生命周期

  • 加载(Loading):从硬盘中读取二进制字节码文件,加载到虚拟机中
  • 检查(Verification): 验证加载进来的class文件格式对不对,安不安全
  • 准备(Preparation): 确定内存, 对静态/常量赋初始值
  • 解析(Resolution): 把字符引用转化为直接引用
  • 初始化(Initialization): 调用一些自定义的代码,比如说静态代码块
  • 使用(Using):
  • 卸载(Unloading):

在Java中使用 Class.forName() 就是对类进行加载

public static void main(String[] args) throws Exception {
   
		
		
		Runtime runtime = Runtime.getRuntime();
		Process P = runtime.exec("cmd /c cd ./src/test/ & javac Main.java -d ../../bin/");
		//获取输入流
		BufferedReader input = new BufferedReader(new InputStreamReader(P.getInputStream()));
		//获取错误流
		BufferedReader err = new BufferedReade
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值