快速业务通道

Mustang与Rhino:Java 6中的脚本编写 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
able compilable = (Compilable) engine; CompiledScript script = compilable.compile(   "if (age < 25){ " +    " riskFactor = 1.5;" +   "} else if (noClaims) {" +    " riskFactor = 0.75;" +   "} else {" +    " riskFactor = 1.0;" +   "}"); Bindings bindings = engine.createBindings(); bindings.put("age", 26); bindings.put("noClaims", Boolean.TRUE); bindings.put("riskFactor", 1); script.eval();

等效的Java代码如下:

public double calculateRiskFactor(int age, boolean noClaims) {   double riskFactor;   if (age < 25) {    riskFactor = 1.5;   } else if (noClaims) {    riskFactor = 0.75;   } else {    riskFactor = 1.0;   }   return riskFactor; }

需要根据具体的条件计算并测试脚本编译所带来的性能提升。一些使用此处所示脚本的简单基准测试显示了大约60%的性能提升。通常,脚本越复杂,从编译中所获得的提升就应该越多。作为一个粗略的测试,我将上面的脚本以及等效的Java代码运行了10000次,得到了以下的结果:

解释后的JS: 1,550ms

编译后的JS: 579ms

编译后的Java: 0.0172ms

编译后的JavaScript大约比解释后的JavaScript运行快3倍。解释后的代码平均运行时间为15ms而编译后的代码平均运行时间为6ms。当然了,正如可以预料到的,真正编译后的Java比解释后的JavaScript大约快了10万倍。然而,如前所述,脚本编写语言的优点在于其他地方。

Invocable接口允许从Java代码调用定义在脚本中的单个函数。invoke()方法所带参数包括要调用的函数名称以及一个参数数组,并返回调用结果:

ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.eval("function increment(i) {return i + 1;}"); Invocable invocable = (Invocable) engine; Object result = invocable.invoke("increment", new Object[] {10}); System.out.print("result = " + result); > result = 11

这种方法允许在JavaScript(或其他脚本编写语言)中编写和维护库,并从一个Java应用程序调用它。在交易中,重要的是要能够根据市场形势快速更新价格规则。例如,一个保险公司可能希望保险精算师能够使用一种平易的脚本编写语言直接设计和维护保险规则和保险费计算算法,随后可以从一个大型J2EE企业架构中对其进行调用。这样的架构可能包括一个在线报价系统、一个用于保险费代理程序的外部应用程序,以及后台业务应用程序,它们全都调用同一个集中式脚本。

Mustang与Rhino:Java 6中的脚本编写(4)

时间:2011-01-06 bea John Ferguson Smart

Web开发

JSR 223规范最伟大的目标之一是要在Java web应用程序中提供非Java脚本编写页面(如PHP)的集成性。这旨在允许将非Java脚本编写页面整合为Java web应用程序的一部分,同时允许从该脚本编写页面调用Java类。例如,下面的PHP代码展示了如何从PHP页面中使用Java对象:

//instantiate a java object = new Java( java.util.Date ); //call a method =->toString(); //display return value echo();

更为重要的是,该规范为与Java web应用服务器的集成提供了一个标准的API,用于访问和修改servlet容器会话数据:

<ul> <? //display session attributes in table =->getSession()->getAttributeNames(); foreach ( as ) { = ->getSession()->getAttribute(); print("<li> = &

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号