为了方便编写Java应用程序,Bean Scripting Framework(BSF)在JVM和多种动态语言之间提供了一种标准接口,包括Ruby、Python、BeanShell、Groovy、和JavaScript;Java Specification Request(JSR)223,提供BSF的成功规范,将成为Java 6里面的标准部分。Java代码能够发送一个变量到JRuby的名称空间JRuby可以直接操作这些Java对象或者返回一个值到Java。使用BSF和JSR223,在Java和任何脚本语言之间的用于解释的语法是相同的。Listing 6显示了一个BSF使用Ruby的基本例子,这些在线例子的完整代码放置在bsf_example目录下。注意BSF不仅包括包外的JRuby支持;但是增加它的简单指令在JRuby文档里面是可使用的。
Listing 6. Embed a Ruby interpreter
在Java里面直接使用JRuby解释器也是可能的,但是像这样会连接你的Java代码到Ruby规范化的Java封装类,这些在BSF/JSR223里面是很严格的。
一个Ruby类是不能从一个Java抽象类继承的。不幸的是,这种限制使你不能简单创建一个具体的Java子类,使用虚方法实现抽象方法用于让Ruby类来继承。这是因为在Ruby/Java继承在JRuby的最近的版本中的第二个限制:Java代码不能多态地调用重写一个Java方法的Ruby方法。
这些限制让Swing的使用显得很困难。比如,通过继承AbstractTableModel去利用添加到TableModel接口的功能是不可能的。你能够将继承转化为代理绕过这个限制:使用一个具体Java填充类继承于抽象类作为类型接口的一个代理,这个接口包括所有的Java方法。一个Ruby类实现这个代理接口。尽管这种做法近似于排除了JRuby的平常优势,但是它提供了基于这个局限的工作区而且在需要的地方提供了弹性:在子类功能里。
这篇文章,我希望能够和你一起分享我在开发Java系统的时候使用Ruby的那种兴奋感。我比较一下Java和Ruby的优点和缺点,而且介绍一下JRuby解释器的支持者和反对者...
Ruby的标准库提供了很多方面的功能。这些不使用本地代码的方式,在JRuby版本中是包含了的。JRuby团队逐渐地完善很多类库,虽然一些是在本地代码上的一个简单层次,就像GUI类Tk一样,将不会再完善。包含其中的Java标准库,提供了很多必要的功能。
JRuby现在在WEBrick Web服务器上提供了Ruby on Rails的基本支持;接下来的一个milestone版本里面将会在任何Servlet容器里面实现RoR的支持。RoR支持将使程序员利用一系列存在的Java库与Web框架的简易性结合在一起,但是确认JRuby是一种可选的Ruby解释器。
因为有BUG,JRuby 0.9需要Java SE 5,但是将会在下一个版本中支持JRE 1.4。
例子
例子jms_example.rb举例说明了JRuby增长长度的用法。它显示了如何将消息从一个类结构传到另外一个类,结合两种不同点的模拟软件定义了分布式游戏引擎。这些代码使用先进的功能和元程序技术将任何类型的XML消息作为Ruby对象进行传输。代码注释可以帮助理解程序逻辑。
在Java里面使用配置到达这种水平是不可能的;至少,用户能够插入编译代码。但是在Ruby里,动态代码是像静态代码一样自然和容易使用的。
Ruby和Java的未来
Ruby可以教会Java程序员很多。RoR框架显示了开发Web应用程序是如此的简单;利用JRuby,RoR将能够重用存在的Java功能。JRuby将在Java应用程序中加入Jython,JavaScript,和其他各种动态脚本语言。想要掌握这些技巧的开发人员需要学习动态脚本,这些将会覆盖越来越多的应用程序开发领域。尽管不使用动态脚本,Java开发者也能够看到Ruby带来的利益如同功能程序和元程序的概念。