科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Java世界的Ruby(3)

Java世界的Ruby(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

这篇文章,我希望能够和你一起分享我在开发Java系统的时候使用Ruby的那种兴奋感。我比较一下Java和Ruby的优点和缺点,而且介绍一下JRuby解释器的支持者和反对者...

作者:silentbalanceyh 来源:MATRIX 2007年9月3日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

除了执行先前的Ruby代码,你仍然可以使用JRuby来构造Java对象,调用Java方法,从一个Java类继承。一个Ruby类能够实现Java接口——有必要的话可以在Java里面静态调用Ruby方法。

为了从Ruby访问Java需要初始化类库,需要以”java”命令开始。接下来用include_class方法指定需要使用的Java类,比如,include_class “javax.jms.Session”。你能够使用include_package导入整个Java包到Ruby模块里面。就像Java导入包的通配符语句一样,尽量避免include_package使用产生的名称冲突是明智的;在JRuby里,如果解释器为了需要的类搜索所有的包也是格外不明智的。尽可能严格地使用include_class。

很多Java标准类的名称和Ruby类的名称相同。为了解决这样的冲突,传递一个代码块到include_class函数,为这个Java类返回一个新名称,而且JRuby将使用这个名称作为Java类的别名。(见Listing4)

Listing 4. Include a Java class with clashing name

require "java"

# The next line exposes Java's String as JString

include_class("java.lang.String") { |pkg, name| "J" + name }

s = JString.new("f")

或者,你可以创建一个包含java类定义的Ruby模块,但是需要在一个隔离的名称空间里面。例如:

Listing 5. Java module importing multiple Java classes

require "java"

module JavaLang

include_package "java.lang"

ends = JavaLang::String.new("a")

JRuby的好处是什么?

像Ruby一样的动态语言经常使用在专业领域就像整合其他系统一样;JRuby在Java里面扮演了这个角色。比如,JRuby能够从一个系统读出数据,将这个数据传递插入到另外一个系统里。当需求改变的时候,修改一段JRuby脚本相对于修改配置文件来说简单得多,所以避免了Java综合代码里面复杂的编译和发布周期。

除开在Ruby里使用Java,你也可以从在Java里使用Ruby,让你的应用程序容易编写。利用JRuby的最小化构造语句方法,你可以创建更加容易使用的专业领域语言供用户工作。比如,一个赌博引擎的脚本系统能够引入Ruby类来描述字符,媒介和其他游戏实体。

此外,使用Ruby的动态机制,用户能够改变脚本类的定义。这些Ruby对象允许直接使用方法管理它的状态和行为。另外一方面,一般使用用户配置好的键值通过Java映射传递,削弱了对象的功能完整性。

Ruby脚本有点像加速过的配置文件。一般Java应用程序的配置都是使用xml文件或者属性文件,但是这些对于参数定义在开发时间上受到了一定限制。使用Ruby脚本能够使你的系统要么从一个文本要么从一个内置编辑器里面读取,用户能够自由自定义行为无论什么情况只要你想放置脚本。这样的方法,Ruby使用行为结合配置,提供了Java插件API的功能,而且不需要JavaIDE或者编译器,节省了构建和发布jar文件的步骤。

例如,一个用户提供的脚本能够嵌入到一个应用程序事件管理里面用来对确认的可疑条件进行过滤,然后将发送一个通知给系统管理员以及在一个特定的安全发行数据库里面记入日志,或者启动脚本能够清除旧文件以及支配用户数据存储。同样的很多富客户端允许用户改变菜单和工具条的位置——使用Ruby嵌入,一个用户的新菜单可以触发任何用户想要的行为。

为了方便编写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

...

// JRuby must be registered in BSF.

// jruby.jar and bsf.jar must be on classpath.

BSFManager.registerScriptingEngine("ruby",

"org.jruby.javasupport.bsf.JRubyEngine",  new String[]{"rb"});

BSFManager manager = new BSFManager();

// Make the variable myUrl available from Ruby.

manager.declareBean("myUrl", new URL("http://www/jruby.org"), URL.class);

// Note that the Method getDefaultPort is available from Ruby

// as getDefaultPort and also as defaultPort.

// The following line illustrates the combination of Ruby syntax

// and a Java method call.

String result = (String) manager.eval(

"ruby", "(java)", 1, 1, "if $myUrl.defaultPort< 1024 then " +

"'System port' else 'User port' end");

在Java里面直接使用JRuby解释器也是可能的,但是像这样会连接你的Java代码到Ruby规范化的Java封装类,这些在BSF/JSR223里面是很严格的。

局限性

很重要的一点是你必须记住JRuby仍然在开发中,它还有很多局限,这些在1.0 release版本之前会固定下来。

一个Ruby类是不能从一个Java抽象类继承的。不幸的是,这种限制使你不能简单创建一个具体的Java子类,使用虚方法实现抽象方法用于让Ruby类来继承。这是因为在Ruby/Java继承在JRuby的最近的版本中的第二个限制:Java代码不能多态地调用重写一个Java方法的Ruby方法。

这些限制让Swing的使用显得很困难。比如,通过继承AbstractTableModel去利用添加到TableModel接口的功能是不可能的。你能够将继承转化为代理绕过这个限制:使用一个具体Java填充类继承于抽象类作为类型接口的一个代理,这个接口包括所有的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带来的利益如同功能程序和元程序的概念。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章