- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
動态生成Java代码的方法
摘要: 本文介绍了如何在普通Java程序中应用代码动态生成技术,并测试、比较了各种实现方法的性能。 提纲: 一、概述 / 二、表达式计算器 / 三、解释法 四、解析法 / 五、编译法 / 六、生成法 / 七、性能和应用 正文: 一、概述 经常有人批评Java的性能,认为Java程序无法与C或C++程序相提并论。为此,Java一直在性能优化上进行着不懈的努力,特别是运行时的性能优化机制,平息了许多责难。但是,不管Java把性能提高到了什么程度,人们对代码性能的渴求是没有止境的。 显然,Java在某些操作上的性能确实无法与C/C++相比,这是由Java语言的特点所决定的,例如为了跨平台而采用了中间语言(字节码)机制。另一方面,由于Java有着许多独特的特性,它可以利用许多其他语言很难采用的优化技术,动态代码生成就是其中之一。 所谓动态代码生成,就是一种在运行时由程序动态生成代码的过程。动态生成的代码和生成它的程序在同一个JVM中运行,且访问方式也相似。当然,和其他优化技术相似,动态代码生成只适用于某些特定类型的任务。 JSP或许就是人们最熟悉的动态代码生成的例子。Servlet引擎能够把客户的请求分发给Servlet处理,但Servlet天生是一种静态的结构。在启动服务器之前,Servlet一般必须先编译和配置好。虽然Servlet有着许多优点,但在灵活性方面,Servlet略逊一筹。JSP技术突破了Servlet的限制,允许在运行时以JSP文件为基础动态创建Servlet。 当客户程序发出了对JSP文件的请求,Servlet引擎向JSP引擎发出请求,JSP引擎处理JSP文件并返回结果。JSP文件是一系列动作的文本描述,这一系列动作的执行结果就是返回给用户的页面。显然,如果每一个用户的请求到达时都通过解释的方式执行JSP页面,开销肯定比较大。所以,JSP引擎编译JSP页面动态创建Servlet。一旦JSP页面被改变,JSP引擎就会动态地创建新的Servlet。 在这里,动态代码生成技术的优势非常明显——既满足了灵活性的要求,又不致于对性能产生太大的影响。在编译Servlet甚至启动服务器时,系统的行为方式不必完全固定;同时,由于不必在应答每一个请求时解释执行JSP文件,所以也就减少了响应时间。 二、表达式计算器 下面我们来看看如何在普通Java程序中使用动态代码生成技术。本文的例子是一个简单的四则运算表达式计算器,它能够计算形如“4 $0 + $1 *”的后缀表达式,其中$0和$1分别表示变量0、变量1。可能出现在表达式中的符号有三种:变量,常量,操作符。 后缀表达式是一种基于堆栈的计算表达式,处理过程从左到右依次进行,仍以前面的表达式为例:先把4和变量0压入堆栈,下一个字符是操作符“+”,所以把当时栈顶的两个值(4和变量0)相加,然后用加法结果取代栈顶的两个值。接着,再把1压入堆栈,由于接下来的是操作符“*”,所以对这时栈顶的两个值执行乘法操作。如果把这个表达式转换成通常的代数表达式(即中缀表达式),它就是“(4 + $0) * $1”。如果两个变量分别是“[3,6]”,则表达式的计算结果是(4+3)*6=42。 为了比较代码动态生成和常规编程方式的性能差异,我们将以各种不同的方式实现表达式计算器,然后测试各个计算器的性能。 本文的所有表达式计算器都实现(或隐含地实现)calculator接口。calculator接口只有一个evaluate方法,它的输入参数是一个整数数组,返回值是一个表示计算结果的整数。 //Calculator.javapublic interface Calculator { int evaluate(int[] arguments);}三、解释法 首先我们来看一个简单但效率不高的表达式计算器,它利用Stack对象计算表达。每次计算,表达式都要重新分析一次,因此可以称为解释法。不过,表达式的符号分析只在对象创建时执行一次,避免StringTokenizer类带来太大的开销。 //SimpleCalculator.javaimport java.util.ArrayList;import java.util.Stack;import java.util.StringTokenizer;public class SimpleCalculator implements Calculator { String[] _toks; // 符号列表 public SimpleCalculator(String expression) { // 构造符号列表 ArrayList list = new ArrayList(); StringTokenizer to
文档评论(0)