快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
脚本编写(2) 时间:2011-01-06 bea John Ferguson Smart

检索结果

现在可以运行脚本了,那么接下来做什么呢?通常我们都希望从脚本编写环境获取求值后的值或表达式,以便用于Java代码。这有两种实现方法。第一种是使用eval()函数返回执行脚本后所返回的值。默认情况下,将返回上次执行的表达式的值。

下例演示了一个虚构的保险公司的保险费计算方法。对于年龄小于25岁的司机,将额外支付50%的保险费。而对于有非保险补助的大于25岁的司机,保险费将打一个25%的折扣。其它情况则应用标准的保险费。这个规则可以使用如下的JavaScript表达式来实现:

ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.put("age", 26); engine.put("noClaims", Boolean.TRUE); Object result = engine.eval( "if (age < 25){ " + " riskFactor = 1.5;" + "} else if (noClaims) {" + " riskFactor = 0.75;" + "} else {" + " riskFactor = 1.0;" + "}"); assertEquals(result,0.75); }

返回值是上次执行的指令的值,所以在本例中就是为riskFactor所赋的值。注意,包含结果(在本例中是riskFactor)的JavaScript变量的值是无关的:只返回值。

与脚本交互的第二种方式是使用Bindings对象。Bindings对象基本上是一个键/值对映射,可用于在Java应用程序和JavaScript脚本之间交换信息。

public void testEvalWithBindings() throws ScriptException {   ScriptEngineManager manager = new ScriptEngineManager();   ScriptEngine engine = manager.getEngineByName("js");   Bindings bindings = engine.createBindings();   bindings.put("age", 26);   bindings.put("noClaims", Boolean.TRUE);   bindings.put("riskFactor", 1);   engine.eval(    "if (age < 25){ " +     " riskFactor = 1.5;" +    "} else if (noClaims) {" +     " riskFactor = 0.75;" +    "} else {" +     " riskFactor = 1.0;" +    "}");   double risk = bindings.get("riskFactor");   assertEquals(risk,0.75); }

访问Java资源

还可以从脚本内部访问Java类和资源。Rhino JavaScript引擎支持importPackage()函数,该函数允许导入Java包。导入之后,就可以在脚本中实例化Java对象,就像在Java中所做的那样:

engine.eval("importPackage(java.util); " + "today = new Date(); " + "print(''Today is '' + today);");

调用Java类上的方法也很容易做到,不管是传递给脚本引擎的对象实例,还是静态类成员。

engine.put("name","John Doe"); engine.eval( "name2 = name.toUpperCase();" + "print(''Converted name = '' + name2);"); > Converted name = JOHN DOE

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

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

可编译且可调用的引擎

某些脚本引擎实现支持脚本编译,这将带来相当大的性能提升。脚本可以被编译或重用,而不是在每次执行时被解释。compile()方法返回一个CompiledScript实例,随后该实例可用于通过eval()方法计算编译后的表达式:

ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Compil

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号