- 浏览: 132728 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
yaoweinan:
没有.....
Itext 5.4.0 生成PDF中文不报错,Adobe 不显示 -
马文涛:
我也发现这个问题了,你找到解决办法了吗?
Itext 5.4.0 生成PDF中文不报错,Adobe 不显示 -
coding1688:
博主辛苦了,也可以参考一下这篇文章:四步轻松搞定瀑布流布局ht ...
瀑布流布局个人实现 -
yaoweinan:
嘿嘿,那个只是最笨的办法,实际上是不行的,现在一般的都有sw ...
文件上传(无刷新,带进度条,带网速)下载完整 -
javazzu:
我为啥不行呢
文件上传(无刷新,带进度条,带网速)下载完整
java 动态编译及执行实现Web式java开发
- 博客分类:
- java reflect
- j2se
- java ee
废话不说,让大家等了这么久,先看看截图 :
编译失败图:
编译成功,执行图:
编译完成,执行时出现异常图:
呵呵,这里当然只能执行一些简单的java编程文件,如果要做更强大的功能还需要大家的努力,下面就揭开内幕:
1.文件保存
package com.servlets; import java.io.File; import java.io.FileWriter; public class FileTool { public static void saveStringToFile(final String content, final String fileName) throws Exception { final File file = new File(fileName); if(file.isDirectory()){ throw new Exception("dir is not allowed!"); } if(file.exists()){ file.delete(); file.createNewFile(); } FileWriter fileWriter=new FileWriter(file); fileWriter.write(content); fileWriter.flush(); fileWriter.close(); } public static void makeDir(String baseDir) { File file = new File(baseDir); file.mkdirs(); } }
2.Servlet
package com.servlets; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import com.dynamic.DynamicCompile; /** * Servlet implementation class JavaProcess */ @WebServlet("/JavaProcess.sock") public class JavaProcess extends HttpServlet { private static final long serialVersionUID = 1L; private final static String ABSLUTE_PATH = "E:/Compile"; /** * @see HttpServlet#HttpServlet() */ public JavaProcess() { super(); } /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); System.out.println(action); if ("compile".equals(action)) { compileFile(request, response); } else if ("run".equals(action)) { run(request, response); } else { } } private void run(HttpServletRequest request, HttpServletResponse response) { String className = request.getParameter("name"); className = className.replace('.', '/'); final String baseDir = ABSLUTE_PATH + "/" + request.getSession().getId() + "/"; ByteArrayOutputStream out=new ByteArrayOutputStream(); DynamicCompile.run(className,baseDir, out); String result = new String(out.toByteArray()); Result result2=new Result(true, result); JSONObject ob = JSONObject.fromObject(result2); ServletOutputStream outputStream; try { outputStream = response.getOutputStream(); PrintWriter o = new PrintWriter(outputStream); o.print(ob); o.flush(); o.close(); } catch (IOException e) { } } private void compileFile(HttpServletRequest request, HttpServletResponse response) { String className = request.getParameter("name"); String content = request.getParameter("file"); className=className.substring(className.lastIndexOf('.')+1); final String baseDir = ABSLUTE_PATH + "/" + request.getSession().getId() + "/"; final String dir = baseDir + className.trim() + ".java"; try { createDir(baseDir); savefileToDir(dir, content); ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintWriter writer = new PrintWriter(out); compileFile(dir, baseDir, writer); String result = new String(out.toByteArray()); JSONObject ob; Result result2; if (result.isEmpty()) { result2 = new Result(true, result); } else { result2 = new Result(false, result); } ob = JSONObject.fromObject(result2); ServletOutputStream outputStream = response.getOutputStream(); PrintWriter o = new PrintWriter(outputStream); o.print(ob); o.flush(); o.close(); } catch (Exception e) { e.printStackTrace(); } } private void createDir(String baseDir) { FileTool.makeDir(baseDir); } private void compileFile(String dir, String baseDir, PrintWriter writer) { DynamicCompile.compile(dir, baseDir, writer); } private void savefileToDir(String dir, String content) throws Exception { FileTool.saveStringToFile(content, dir); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
3.执行编译
package com.dynamic; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import com.sun.tools.javac.Main; public class DynamicCompile { public static void compile(String dir, String baseDir,PrintWriter writer){ String[] agrs=new String[]{"-d",baseDir,dir}; Main.compile(agrs,writer); } public static boolean run(String className,final String baseDir, ByteArrayOutputStream out){ PrintStream out1=new PrintStream(out); PrintStream err = System.err; PrintStream out2 = System.out; System.setErr(out1); System.setOut(out1); XClassLoader load=null; load=new XClassLoader(baseDir); try { Class<?> loadClass = load.loadClass(className); final Method method = loadClass.getMethod("main", new Class[] { String[].class }); method.invoke(null,new Object[]{new String[]{"21","df","dd"}}); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.setErr(err); System.setOut(out2); return false; } }
4.类加载
package com.dynamic; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class XClassLoader extends ClassLoader { private final String classPath; public XClassLoader(String classPath) { super(); this.classPath = classPath; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { FileInputStream fs; try { final String path = classPath+ name +".class"; fs = new FileInputStream(path); int s=fs.available(); byte[] bs=new byte[ s]; fs.read(bs, 0, s); final String className = name.replace('/','.'); return this.defineClass(className, bs, 0, s); } catch (FileNotFoundException e) { throw new ClassNotFoundException("Not Found"); } catch (IOException e) { throw new ClassNotFoundException("Not Found"); } } }
5.返回数据对象类
package com.servlets; public class Result { private boolean success; private String msg; public Result(boolean success, String msg) { super(); this.success = success; this.msg = msg; } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
6.前台界面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="./extjs3/resources/css/ext-all.css" /> <script type="text/javascript" src="./extjs3/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="./extjs3/ext-all.js"></script> <style type="text/css"> html,body { font: normal 12px verdana; margin: 0; padding: 0; border: 0 none; overflow: hidden; height: 100%; } </style> <title>Java Compile</title> <script type="text/javascript"> Ext.onReady(function() { Ext.BLANK_IMAGE_URL = './extjs3/resources/images/default/s.gif'; var text = new Ext.form.TextArea({ region : 'center' }); var textName = new Ext.form.TextField({ fieldLabel : 'Class Name', allowBlank:false, width : '98%' }); var namePanel = new Ext.Panel({ region : 'north', height : '30px', items : [ { xtype : 'form', layout : 'form', labelWidth :70, layoutConfig : { labelSeparator : ':' }, labelAlign : 'left', frame : false, padding : '8px', items : [ textName ] } ] }); var compileBtn = new Ext.Button({ text : 'Compile' }); var runBtn = new Ext.Button({ text : 'Run' }); var panel_text = new Ext.Panel({ region : 'center', title : 'Java Compile', layout : 'border', items : [ namePanel, text ], buttons : [ compileBtn, runBtn ] }); var console_text = new Ext.form.TextArea({ width : '100%', readOnly : true, height : 200 }); var panel_console = new Ext.Panel({ region : 'south', title : 'Console', collapsible : true, height : 200, items : [ console_text ] }); var viewport = new Ext.Viewport({ layout : 'border', items : [ panel_console, panel_text ] }); var comileSuccess = function(response,ops) { var rs=Ext.util.JSON.decode(response.responseText); console_text.setValue(rs.msg); } var faild = function(e) { } var compile = function(e) { if (e == 'ok') { var javaCode = text.getValue(); var clsName = textName.getValue(); Ext.Ajax.request({ url : 'JavaProcess.sock', method :'GET', success : comileSuccess, failure : faild, params : { action:'compile', file : javaCode, name : clsName } }); } } compileBtn.on('click', function() { Ext.Msg.show({ title : 'Notice', msg : 'Are you sure to compile the code?', buttons : Ext.Msg.OKCANCEL, fn : compile, icon : Ext.MessageBox.QUESTION }); }); runBtn.on('click',function(){ var clsName = textName.getValue(); Ext.Ajax.request({ url : 'JavaProcess.sock', method :'GET', success : comileSuccess, failure : faild, params : { action:'run', name : clsName } }); }); }); </script> </head> </body> </html>
小结:在此例子中使用了java反射技术,java动态编译,加载类技术和Jave EE技术,达到了在网页里面编写简单java程序的功能,抛砖引玉,希望大家看了之后能够想到更多,实现更强大的功能。譬如说把编译后的class存在数据库里面,实现一些匪夷所思的功能:)
发表评论
-
写自己的框架,让别人笑掉大牙吧(AOP)
2013-04-30 12:50 622基于前面破框架我自己也实现了一下AOP技术,AOP技术现在也很 ... -
写自己的框架,让别人笑掉大牙吧(IOC2)
2013-04-22 14:23 858上篇中主要使用配置文件来定义一些类实例之间的组织关系 ... -
写自己的框架,让别人笑掉大牙吧(IOC1)
2013-04-19 17:44 748IOC在java框架中到处可见,我们只需要创建 ... -
关于java中对象属性值的校验的思考
2013-04-15 14:09 1506现在在java 开发中经常会遇到要交验某个obje ... -
Ant 使用小结
2013-03-01 15:25 781以前的项目中都没有用到过ant,都是手动打war,复制cop ... -
JXLayer 使用简单介绍
2012-11-01 17:25 1271JXLayer 是一个很好的Swing 控件装饰类库,其主要要 ... -
关于Jtextinpt 内容的限制
2012-09-28 15:00 754在JTextInput 限制输入内容,这个一般的通过按键输入进 ... -
Spring mvc 小编(配置)
2012-09-26 15:58 983上一篇讲述了Spring mvc 中常用的几个注解标示,这章 ... -
Spring mvc 小编(注解)
2012-09-21 17:16 1034前不久做web 项目用过spring mvc 觉着这玩意挺不错 ... -
构造中的多态
2012-08-25 23:19 815各位仁兄,前几日我在 ... -
Swing JtableModel 使用之旅
2012-07-29 03:25 989JTable 是我们一般展示数据的一个很好的Grid组建,个人 ... -
模版模式(TemplatePattern)
2012-07-15 11:08 750模版模式分为2个部分 1.抽象模版 2.具体模版 ... -
门面模式(Facade Pattern)
2012-06-10 19:37 922门面模式(Facade Pattern):门面模式在我个人感觉 ... -
代理模式例子
2012-06-04 15:07 938代理模式简单点就和现实中一样,只是代理实质性的还是别人在做。比 ... -
策略模式应对旅行中出现的问题
2012-06-04 14:21 809策略模式是针对在进行过程中出现一些问题的应对模式。一般可以分为 ... -
java 工厂模式简单介绍及例子
2012-06-03 23:16 1010java中工厂模式在java ee中经常碰见,是一种常见的模式 ... -
java 动态代理及自定义标注使用例子
2012-06-03 00:14 1158java中动态代理,在实际应用中有着很大的作用,譬如在一些类似 ... -
response.setContentType("") 小抄本
2012-02-18 10:00 773response.setContentType(" ... -
ftp文件上传 、下载
2012-02-09 13:36 1454使用spring mvc +commons-net-1.4.1 ... -
flex3 socket+java
2012-02-06 12:10 1026首先解决的问题是flex的沙箱问题,由于flex 连接服务器存 ...
相关推荐
java动态编译 ,写了一个jsp在页面上编辑java代码,然后servlet动态编译并执行main方法
《Java Web开发实战1200例(第2卷)》附带有配套DVD光盘,光盘中提供有书中全部实例的源代码,这些源代码都是经过作者精心调试通过的,保证能够在Windows XP、Windows 2003及Windows 7操作系统下编译和运行。...
介绍了如何通过ant进行java web工程的编译操作的详细配置
本人常用的java反编译工具,因为经常从客户那里拿到各种web系统,又想去研究一下,所以弄了这个反编译工具,能够对整个java项目进行反编译,速度很快
Java Web开发常见问题.pdf
使用web3j实现abi转java实现效果 智能合约地址 区块链地址和账户密钥
Java语言具有功能强大和简单易用两个特征,具有简单性、面向对象、分布式等特点,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。JDK(Java Development Kit)称为Java开发包或Java开发工具...
eclipse Java 反编译插件,先将文件解压出来变成jd-eclipse-site-1.0.0-RC2.zip,Help > Install New Software...>Add(jd-eclipse-site-1.0.0-RC2.zip)>next>next>Finish添加就可以了使用了
一款小巧简洁的java反编译工具!可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件
NULL 博文链接:https://doujiang327.iteye.com/blog/1296450
Web环境下Java表达式的动态编译与计算
Java+Web开发实践教程ppt课件源码整理
JSP是Java Server Pages的缩写,是由Sun Microsystem公司于1999年6月推出的新技术。...JSP是基于Java Servlet以及整个Java...JSP是通过编译后执行的,完全克服了ASP的脚本级解释执行的缺点,目前以成为Web开发的主流选择。
java反编译 .exe 可以看看你的文件是否重新编译了
《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境...
java反编译工具可以直接对文件夹进行扫描,批量混淆压缩工具需要。net高版本支持
《Java Web服务:构建与运行》通过提供混合架构概述、完整的工作代码示例以及短而精确的编译、部署和执行应用程序的指示,采用明确实用的方法来处理这些技术。你将学习如何从头开始编写Web服务以及集成现有服务到你...
我们从系统环境的安装、配置、创建工程、调试、编译,到系统的发布和部署,一步步、手把手地教你实现。而对于有经验的程序员,《用案例学JavaWeb整合开发:Java+Eclipse+Struts2+Ajax》也是一本“企业级案例”的参考...
最近发布的 Google Web Toolkit (GWT) 是一组全面的 API 和工具,它支持用户几乎完全使用 Java™ 代码来创建动态 Web 应用程序。Philip McCarthy 回到了他广受欢迎的面向 Java 开发人员的 Ajax 系列,向您展示 GWT ...
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,舍弃了容易...