源码:JAVA在线编译器模拟

简介: 有很多网站提供在线编译运行java代码,不过大家要做好安全工作,防止恶意浏览者攻击,下面做一个雏形,欢迎大家改进 [java]public class CompileAndRunJavaFile extends HttpServlet{ private static Process process ;//执行子进程 /** * 编译


有很多网站提供在线编译运行java代码,不过大家要做好安全工作,防止恶意浏览者攻击,下面做一个雏形,欢迎大家改进

[java]

public class CompileAndRunJavaFile extends HttpServlet{ 
     
    private static Process process ;//执行子进程  
 
    /**
     * 编译并且运行JAVA代码
     * @author Maple
     */ 
     
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException { 
        String code = req.getParameter("code");//获取页面参数  
         
        String className = null; //类名  
        String classStr = null; 
        BufferedWriter bw = null; 
        try{ 
            classStr = code.substring(code.indexOf("public class"),code.indexOf("{")).toString();//获取类名字符串  
            String[] classStrArray = classStr.split("\\s{1,}");//按空格分开  
             if(classStrArray.length!=3){ 
                 req.setAttribute("msg", "编译失败:格式不符合规范,请检查类名是否正确(如:public class YouClassName{})"); 
             } 
             else{ 
                 className = classStrArray[classStrArray.length-1]; 
                 File sourceFile = new File(className+".java");//保存源代码  
                 if(sourceFile.exists()){ 
                     sourceFile.delete(); 
                 } 
                 FileWriter fr = new FileWriter(sourceFile); 
                 bw = new BufferedWriter(fr); 
                 bw.write(code); 
                 bw.close(); 
                 fr.close(); 
                  
                 Runtime runtime = Runtime.getRuntime(); 
                 process = runtime.exec("cmd"); 
                 Thread.sleep(1000);//防止cmd.exe程序未启动,当然也可以直接使用javac命令  
                 //往控制台注入命令  
                 bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
                 bw.write("javac "+className+".java \n"); 
                 bw.flush(); 
                 long startFreeMemory = runtime.freeMemory();//Java 虚拟机中的空闲内存量  
                 //执行时间也是无法知道,因为dos执行java命令,程序无法知道它到底执行到那里了,两个进程,互不了解  
                 long startCurrentTime = System.currentTimeMillis();//获取系统当前时间  
                 bw.write("java "+className+" \n"); 
                 bw.close(); 
                 //获取控制台输出的结果  
                 Thread runtimeInput = new Thread(new RuntimeInput()); 
                 runtimeInput.start(); 
                  
                 //获取内存信息,实际过程中,是无法得到这个程序到底多少内存,内存的分配有操作系统决定,如果  
                 //程序需要,系统会动态分配内存,如果有对象没有引用,可能会被垃圾回收器回收,所以是无法得到到底多少内存的  
                 //如果你有办法知道,可以留言,现在得到程序运行前后内存使用率,不过输出的是0,因为程序退出,不占内存了  
                 Thread.sleep(1000); 
                 long endCurrentTime = System.currentTimeMillis(); 
                 long endFreeMemory = runtime.freeMemory(); 
                 double useMemory = (startFreeMemory-endFreeMemory)/1024; 
                 System.out.println("开始时间:"+startCurrentTime); 
                 System.out.println("结束时间:"+endCurrentTime); 
                 long useTime = endCurrentTime-startCurrentTime; 
                  
                 req.setAttribute("msg","编译成功,使用时间:"+useTime+"毫秒");//这个使用时间是大概的,不精确  
                  
             } 
        } 
        catch(Exception e){ 
            e.printStackTrace(); 
            req.setAttribute("msg", "格式不符合规范,请检查类名是否正确(如:public class YouClassName{}).错误信息:"+e.getMessage()); 
        } 
         
         req.getRequestDispatcher("/test.jsp").forward(req, resp); 
         
    } 
     
     
    public class RuntimeInput implements Runnable{ 
 
        @Override 
        public void run() { 
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
            String content = null; 
            try { 
                while((content = br.readLine()) != null){ 
                     System.out.println(content);//如果想把结果输出到页面,直接定义变量就行  
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
         
    } 
 
} 
public class CompileAndRunJavaFile extends HttpServlet{
 
 private static Process process ;//执行子进程

 /**
  * 编译并且运行JAVA代码
  * @author Maple
  */
 
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String code = req.getParameter("code");//获取页面参数
  
  String className = null; //类名
  String classStr = null;
  BufferedWriter bw = null;
  try{
   classStr = code.substring(code.indexOf("public class"),code.indexOf("{")).toString();//获取类名字符串
   String[] classStrArray = classStr.split("\\s{1,}");//按空格分开
    if(classStrArray.length!=3){
     req.setAttribute("msg", "编译失败:格式不符合规范,请检查类名是否正确(如:public class YouClassName{})");
    }
    else{
     className = classStrArray[classStrArray.length-1];
     File sourceFile = new File(className+".java");//保存源代码
     if(sourceFile.exists()){
      sourceFile.delete();
     }
     FileWriter fr = new FileWriter(sourceFile);
     bw = new BufferedWriter(fr);
     bw.write(code);
     bw.close();
     fr.close();
    
     Runtime runtime = Runtime.getRuntime();
     process = runtime.exec("cmd");
     Thread.sleep(1000);//防止cmd.exe程序未启动,当然也可以直接使用javac命令
     //往控制台注入命令
     bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
     bw.write("javac "+className+".java \n");
     bw.flush();
     long startFreeMemory = runtime.freeMemory();//Java 虚拟机中的空闲内存量
     //执行时间也是无法知道,因为dos执行java命令,程序无法知道它到底执行到那里了,两个进程,互不了解
     long startCurrentTime = System.currentTimeMillis();//获取系统当前时间
     bw.write("java "+className+" \n");
     bw.close();
     //获取控制台输出的结果
     Thread runtimeInput = new Thread(new RuntimeInput());
     runtimeInput.start();
    
     //获取内存信息,实际过程中,是无法得到这个程序到底多少内存,内存的分配有操作系统决定,如果
     //程序需要,系统会动态分配内存,如果有对象没有引用,可能会被垃圾回收器回收,所以是无法得到到底多少内存的
     //如果你有办法知道,可以留言,现在得到程序运行前后内存使用率,不过输出的是0,因为程序退出,不占内存了
     Thread.sleep(1000);
     long endCurrentTime = System.currentTimeMillis();
     long endFreeMemory = runtime.freeMemory();
     double useMemory = (startFreeMemory-endFreeMemory)/1024;
     System.out.println("开始时间:"+startCurrentTime);
     System.out.println("结束时间:"+endCurrentTime);
     long useTime = endCurrentTime-startCurrentTime;
    
     req.setAttribute("msg","编译成功,使用时间:"+useTime+"毫秒");//这个使用时间是大概的,不精确
    
    }
  }
  catch(Exception e){
   e.printStackTrace();
   req.setAttribute("msg", "格式不符合规范,请检查类名是否正确(如:public class YouClassName{}).错误信息:"+e.getMessage());
  }
  
   req.getRequestDispatcher("/test.jsp").forward(req, resp);
  
 }
 
 
 public class RuntimeInput implements Runnable{

  @Override
  public void run() {
   BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
   String content = null;www.2cto.com
   try {
    while((content = br.readLine()) != null){
      System.out.println(content);//如果想把结果输出到页面,直接定义变量就行
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
 }

}


作者:mzlqh
原文链接:http://www.2cto.com/kf/201206/136672.html

目录
相关文章
|
22天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
59 7
|
1月前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
32 4
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
14天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
80 13
|
28天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
55 12
|
22天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
46 3
|
24天前
|
人工智能 移动开发 安全
家政上门系统用户端、阿姨端源码,java家政管理平台源码
家政上门系统基于互联网技术,整合大数据分析、AI算法和现代通信技术,提供便捷高效的家政服务。涵盖保洁、月嫂、烹饪等多元化服务,支持多终端访问,具备智能匹配、在线支付、订单管理等功能,确保服务透明、安全,适用于家庭生活的各种需求场景,推动家政市场规范化发展。
|
1月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
100 3
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。