Do-Java-Online

Java Online Executor
资源获取连接:https://github.com/zhaohandd/Do-Java-Online/

背景

最近一直在做LeetCode上的算法题,像这种在线编程网站都会提供一个在线编写,运行代码的窗口,如下图。

正好最近在看周志明老师的《深入理解Java虚拟机》这本书,在书中的第九章《类加载及执行子系统的案例与实战》中详细讲解了“如何实现远程执行功能”,与上述在线执行器的思路一致。
结合TangBean同学的OnlineExecutor项目,后续会完善多个相关功能:

  • 用户注册登录
  • 上传文件,显示
  • 美化页面

展示

原理

在程序实现的过程中,我们需要解决三个问题:

  • 如何编译页面编写的Java代码
  • 如何执行编译之后的Java代码
  • 如何收集Java代码的执行结果

问题一解决方案:

使用javax.tools包可以实现Java源代码编译,优点如下:

  • 它是经过认可的 Java SE 扩展,这意味着它是 Java Community Process(按照 JSR 199 规范)开发的标准 API。com.sun.tools.javac.Main API 不属于 经过文件归档的 Java 平台 API,因此没有必要在其他供应商的 JDK 中提供或保证在未来版本的 Sun JDK 中提供该 API。
  • 您可以应用已经掌握的知识:Java 源代码,而不是字节码。不需要学习生成有效字节码的复杂规则或者新的类对象模型、方法、语句和表达式,通过生成有效的 Java 源代码,您就可以创建正确的 Java 类。
  • 它简化了一种受支持机制,并进行了标准化,使您不用局限于基于文件的源代码就可生成并加载代码。
  • 它可以在 JDK Version 6 和更高版本的各种供应商实现之间移植,并且将来也支持这种移植性。
  • 它使用经过验证的 Java 编译器。
  • 与基于解释器的系统不同,所加载的类可以从 JRE 的运行时优化中受益。

问题二解决方案:

要执行编译后的Java代码,让类加载器加载这个类生成一个Class对象,然后反射调用一下某个方法就可以了(因为不实现任何接口,我们可以借用一下Java中人人皆知的“main()”方法)。但我们还应该考虑到:一段程序往往不是编写、运行一次就能达到效果,同一个类可能要反复修改、提交、执行。还有,既然提交的是临时代码,那提交Java类在执行完后就应当能卸载和回收。

问题三解决方案:

把程序往标准输出(System.out)和标准错误输出(System.err)中打印的信息收集起来,但标准输出设备是整个虚拟机进程全局共享的资源,如果使用System.setOut()/System.setErr()方法把输出流重定向到自己定义的PrintStream对象上固然可以收集输出信息,但也会对原有程序产生影响;会把其他线程向标准输出中打印的信息也收集了。虽然这些并不是不能解决的问题,不过为了达到完全不影响原程序的目的,我们可以采用另外一种办法,即直接在执行的类中把对System.out的符号引用替换为我们准备的PrintStream的符号引用。

祝进步

Java Online IDE相关推荐

  1. Linux上的JAVA的IDE,在linux上运行的基于文本的强大java IDE

    问题是 – 我喜欢旧货;) 有一些我喜欢的旧笔记本电脑.它当然运行Xorg,而且速度很快.但Intellij IDEA仍然很慢. 想过emacs,但从未使用过. emacs不是太复杂了吗? 在许多窗口 ...

  2. 程序员必知的8个Java开源IDE工具!你最钟意哪个?

    出色的Java工具有助于提高工作效率.Java IDE 工具提供了多种用户独特需求和个人偏好来创建编程环境的方法. 今天,播妞给大家分享8个程序员最爱的Java开源IDE工具,没有用过的小伙伴,快快收 ...

  3. java的ide是什么_什么是IDE,java开发的ide是什么?

    1.什么是IDE 释义一: 集成设备电路,Integrated Device Electronics,一般叫做IDE总线,但是更准确地应该是ATA.IDE总线是平行总线,在SATA(Serial AT ...

  4. 软件java安卓版_AIDE软件下载-AIDE【Java开发IDE软件】下载v3.2.18 安卓版-西西软件下载...

    AIDE[Java开发IDE软件]是一款安卓Java开发应用类软件,支持代码编写调试功能,帮助用户的安卓手机进行项目调试,软件支持多种编辑方式,代码解析度高,本次放出AIDE安卓版下载,有相关代码调试 ...

  5. Eclipse Java IDE 和 Eclipse Java EE IDE 工具区别

    Eclipse Java IDE (轻量级,初学) 默认只带了 GUI 和 swings 的库,但是并不支持 web 及数据库开发. Eclipse Java EE IDE (企业版.web开发) E ...

  6. 蓝桥杯软件类Java语言IDE(Eclipse)安装

    蓝桥杯软件类Java语言IDE(Eclipse)安装以及个性化设置 平时都在用idea搞工程类项目,正好报了下学期的蓝桥杯算法比赛,看到官网要求用eclipse编码,之前也参加过ccf-csp的比赛, ...

  7. 如何把VS Code打造成Java开发IDE?

    近期,公司推行正版化,本人使用的是JetBrains教育版,是不允许进行商业开发的,因此开启了艰难的备用IDE选型之路.最终,我选定了轻量级的Visual Studio Code(以下简称VS Cod ...

  8. java ee ide 添加spring,如何在Eclipse IDE项目文件夹中为spring添加jar文件

    I am going to start MVC with Spring framework, but I am unable to get jar file of spring framework . ...

  9. java无ide编译_[转]无IDE时编译和运行Java

    本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...

  10. 把VS Code打造成Java开发IDE,也挺爽!

     作者:LarvaZhang cnblogs.com/larva-zhh/p/13723530.html 近期,公司推行正版化,本人使用的是JetBrains教育版,是不允许进行商业开发的,因此开启了 ...

最新文章

  1. 百度之星试题每周一练
  2. 公司新来的同事一顿操作把大家整懵了,问了他的经历细思极恐。。。
  3. SAP QM 通过控制图 (Control Chart) 的实现提升企业质量管理水平
  4. 四、MapReduce和Yarn基本架构
  5. 天天象棋 残局闯关 第19关
  6. Thymeleaf th:include、th:replace使用
  7. matlab from有什么用,Matlab函数使用'fromworkspace'将向量传递给simulink
  8. MFC窗口程序显示命令行输出窗口的方法
  9. 洛谷P1856 [USACO5.5]矩形周长Picture
  10. 第二代电子计算机逻辑部件主要由,计算机组成原理参考答案
  11. 免疫优化算法 matlab,基于人工免疫克隆选择算法的调度优化MATLAB源码
  12. git修改user.name 和user.email
  13. Atitit 核心技术有哪些一般 目录 第一章 Rest调用交互 2 第二章 2 第三章 Cmd调用交互 2 第四章 2 第五章 爬虫技术 2 第一节 Httpclient 2 第二节 Html
  14. 2018厦门大学计算机技术分数线,2018厦门大学专业排名及分数线 王牌专业有哪些...
  15. android版局域网限速,局域网手机WiFi网速怎么限速
  16. ESP8266制作物联网万能遥控器
  17. java获取日期/时间
  18. oracle求整数取余,oracle 取余 取整 字符串连接
  19. FZU 2301 Chosen by god (组合数学+打表+快速幂)
  20. 是计算机实现研究的内容,计算机硕士论文开题报告分享

热门文章

  1. 魔兽DOTA高玩的自述
  2. 如何理解奇偶校验只能发现数据代码中奇数位出错的情况
  3. 学编程和学机器人有什么区别
  4. Linux下的dd和cat
  5. H264系列(7):H.264与MPEG4区别
  6. 【量化投资】03.量化工程abu学习之量化基础(1/3)
  7. 解决AMD Software提示图形驱动版本不匹配问题
  8. 武汉关谷职业学院计算机中心,武汉光谷职业学院2021年宿舍条件
  9. 大米手机现身了,小米一脸蒙圈?大米好么?好在哪里呢?
  10. 【LINGO】lingo18下载安装(亲测有效)