EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 1009|回复: 2
打印 上一主题 下一主题

[技术探索] Java 5.0中实现JSR-223的方法

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12408

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-4-29 14:57:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最新的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实现,但是其它语言应该是基本相同的。

  那么如何在Java 5中使用JSR-223的实现呢? 偶经过仔细地研究, 终于找到了解决方法....

  1. 干活要从理论开始....

  根据JavaDoc的说法, javax.script.ScriptEngineManager 是通过JAR规范中所谓的服务提供商(Service Provider)方法来在库中检索 javax.script.ScriptEngineFactory 实现类并自动注册的. OK, 了解了这个就好办了, 准备开始干活哈....

  2. 开始动手干活了.... :)

  首先制作JSR-223规范实现的包(包括SUN的JavaScript默认实现):

  使用WinRAR等压缩工具打开JRE6中rt.jar文件(注意要提前备份!我的就是备份为jsr-233.jar), 如图1所示:

  

                               
登录/注册后可看大图

  图1 rt.jar的目录结构

  OK,下面开始删除文件.... 除了com.sun.script、sun.org、javax.script、META-INF目录之外,其余的目录全都删除。删除后如下图所示:

  

                               
登录/注册后可看大图

  图2 删除后的目录结构

  目录做好之后,下面开始按照JAR规范所描述的Service Provider方法来创建文件以便于 javax.script.ScriptEngineManager 的检索:

  ·在META-INF目录下建立一个名称为 services 的目录。

  ·在 services 目录中新建名称为 javax.script.ScriptEngineFactory 的空文件。

  ·在 javax.script.ScriptEngineFactory 文件中,写入“com.sun.script.javascript.RhinoScriptEngineFactory”数据,注意不写引号。

  

                               
登录/注册后可看大图

  图3 新加入的services目录和文件

  最后,将所有改动保存到jsr-223.jar文件中,工作完成!

  3. 测试包

  将jsr-223.jar加入到项目的库中,然后编写下面的代码:

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! 下面是其在Eclipse下运行的截图:

  

                               
登录/注册后可看大图

  图4 测试程序在Eclipse下的运行情况

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

25

主题

597

帖子

1万

积分

BIM大师

Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

积分
11121

社区QQ达人

2F
发表于 2014-4-29 18:23:46 | 只看该作者
不明觉厉,顶一个。

25

主题

1697

帖子

3641

积分

BIM总监

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

积分
3641

社区QQ达人

3F
发表于 2014-4-30 11:53:31 | 只看该作者
楼主的帖子都有一种曲高和寡的赶脚...
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-30 12:18

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表