分享
 
 
 

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

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

最新的Java主版本(Java SE 6,又称Mustang)现在正处于beta版本阶段。虽然该版本并不像Java 5的更新那么多,但是它确实有一些有趣的新特性。毋庸置疑,其中的一个就是对脚本编写语言的支持。

诸如PHP、Ruby、javascript、Python(或Jython)之类的脚本编写语言被广泛应用于许多领域,并由于其灵活性和简单性而大受欢迎。由于脚本是被解释而不是被编译的,所以可以轻松地从命令行运行和测试它们。这就压缩了编码/测试周期,并提高了开发人员的生产率。脚本通常是动态键入的,其语法极富表现力,所编写出的算法要比Java中的等效算法简明得多。使用起来通常也很有趣。

在很多情况下,从Java使用脚本编写语言会很有用,比如为Java应用程序提供扩展,以便用户可以编写自己的脚本进行扩展或定制化核心功能。脚本编写语言可读性更强,也更轻易编写,所以(从技术上来说)它们是用于为终端用户提供根据需求定制化产品的可能性的理想语言。

早已经有许多Java可用的独立脚本编写包了,包括Rhino、Jacl、Jython、BeanShell、JRuby等。新消息是Java 6通过一个标准接口为脚本编写语言提供了内置支持。

Java 6提供对JSR-223规范的全面支持。该规范提供了一种从Java内部执行脚本编写语言的方便、标准的方式,并提供从脚本内部访问Java资源和类的功能。Java 6附带了与Mozilla Rhino的JavaScript 实现的内置集成。基于该规范,对诸如PHP、Groovy和BeanShell之类的其它脚本编写语言的支持也正在进行中。本文关注的是Rhino实现,但是其它语言应该是基本相同的。

脚本编写语言的名称都从何而来?由于大多数脚本编写语言都来自于开源项目,所以其名称通常都是由其各自的编写者想出来的。Rhino(犀牛)的名称来自于O'Reilly关于JavaScript的书封面上的动物。PHP则遵从Unix自解释的惯例,是PHP: Hypertext Preprocessor的简写。Jython是Python脚本编写语言的Java实现。而Groovy只是为了显酷。

使用脚本引擎

JSR 223规范方便易用。要使用脚本,您只需了解一些要害类。主要是ScriptEngine类,它处理脚本解释和求值。要实例化一个脚本引擎,应该使用ScriptEngineManager类来检索感爱好的脚本编写语言的ScriptEngine对象。每种脚本编写语言都有一个名称。Mozilla Rhino ECMAScript脚本编写语言(通常称为JavaScript)使用“js”进行标识。

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("js");

嵌入式的JavaScript可用于各种用途。因为它要比硬编码的Java灵活且更轻易配置,所以通常还可以用于编写频繁更改的业务规则。使用eval()方法对脚本表达式进行求值。脚本编写环境中所使用的任何变量都可以使用put()方法从Java代码内部赋值。

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("js");

engine.put("age", 21);

engine.eval( "if (age >= 18){

" + " print('Old enough to vote!'); " +

"} else {"

+ " print ('Back to school!');" +

"}");

> Old enough to vote!

eval()方法还接受一个Reader对象,这使它轻易在文件或其他外部源中保存脚本,如下例所示:

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("js");

engine.put("age", 21);

engine.eval(new FileReader("c:/voting.js"));

检索结果

现在可以运行脚本了,那么接下来做什么呢?通常我们都希望从脚本编写环境获取求值后的值或表达式,以便用于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脚本之间交换信息。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有