首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在 Ruby on Rails 应用程序中重用 Java 代码 更新

在 Ruby on Rails 应用程序中重用 Java 代码 更新

导入 Java 类清单 1 中的前三行将调用 RJB 的 import 方法,将所需的类分别导入到 Ruby 变量 tararchive、fileinputstream 和 file 中。必须指定类的完整包路径 — 例如,TarArchive 类为 com.ice.tar.TarArchive,而 FileInputStream 类为 java.io.FileInputStream— 就像使用 java 命令运行应用程序那样。
实例化导入的类接着,清单 1 创建导入类的对象。可以通过调用每个类的 new 方法创建类,就像创建任何 Ruby 对象一样(例如,tararchive.new)。但是这样做会调用 TarArchive 类的默认的构造函数(没有参数),而您并不希望这样做。
当重载了类的构造函数后,需要对上面的对象创建方法进行一些修改。在这种情况下,必须按照下面的方式创建对象:
1
object = Classname.new_with_sig('signature', parameter[,more parameters])




第一个参数定义构造函数所需的参数的签名类型。它告诉 RJB 调用其输入参数匹配指定签名的构造函数。
清单 1 中的第 4 个和第 5 个语句分别创建 file 和 fileinputstream 类的对象,它们调用相应的构造函数,参数类型为 String。
在清单 1 的第 6 个语句中,TarArchive 类的其中一个构造函数接受 InputStream 类型的对象作为参数。该语句的签名类型是一个单独的 InputStream 输入参数。这些类型签名的详细细节在 getName API 的 Java SDK 文档中做了很好的描述(参见 )。第二个参数是创建的 InputStream 类型对象。
检验对象创建清单 1 中的其余内容将检验 RJB 创建的对象是否是指定类的对象,方法是调用添加到每个对象的 _classname 方法。例如,调用 tararchive_instance._classname 将返回 com.ice.tar.TarArchive,这意味着类被正确装载,并成功创建了该类的对象。
调用方法并捕获结果将类装载到 Ruby 并从中创建了对象后,下一步是调用需要的方法并查看结果。例如,您希望使用 TarArchive 类的 extractContents 方法,将样例文件(test.tar)的内容提取到当前目录中。
和构造函数一样,可以使用两种方式调用方法。一种方式是直接调用方法,例如:
1
tararchive_instance.extractContents(file_instance)




当方法重载后,使用 _invoke 调用指定方法的每个参数的类型签名:
1
tararchive_instance._invoke('extractContents', 'Ljava.io.File;', file_instance)




这一步可以使 RJB 知道在方法重载时应该调用哪些方法。
和对待普通 Ruby 代码一样,您将捕获对象方法返回的结果(如果有的话),并在自己的应用程序中使用结果。方法调用返回的结果被自动转换为相应的对象类型。您只需在对象内直接调用方法。
Java TarArchive 类中实现的功能现在可以用于您的 Ruby 代码。通过使用相同的方法,Java 代码中已实现的任何功能可以不加修改地在您的 Ruby 和 Rails 应用程序中重用。
完整的代码清单 2 展示了本教程示例的完整 Ruby 代码(也可以通过  获得):
清单 2. 完整的示例 Ruby 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Include 'rjb' library into your application

require 'rjb'

# Load the JVM specifying the jar files to include and any other optional JVM arguments

Rjb::load(classpath = '.:/path/to/tar.jar', jvmargs=[])

# Import the classes you want to use into a Ruby variable
# specify the full package path to the classes.

tararchive = Rjb::import('com.ice.tar.TarArchive')
fileinputstream = Rjb::import('java.io.FileInputStream')
file = Rjb::import('java.io.File')

# Create objects of the classes. Use the new method directly or use
# the 'new_with_sig' call to invoke overloaded constructors with arguments

# Directory you want to extract the files in this case, the current directory

file_instance = file.new_with_sig('Ljava.lang.String;','.')

# inputstream instance of the file to extract

fileinputstream_instance = fileinputstream.new_with_sig('Ljava.lang.String;','test.tar')

# tararchive instance of the file to be extracted.

tararchive_instance = tararchive.new_with_sig('Ljava.io.InputStream;'\
                  ,fileinputstream_instance)

# Invoke the method from the class and capture the results.
# Use either the direct call of the method,
# or the '_invoke' call to invoke overloaded methods.

p 'Extracting file.....'

tararchive_instance.extractContents(file_instance)

p 'Done...'




尝试这些代码,将清单 2 中的代码保存到一个文件中,并且扩展名为 .rb(或使用  中的 rjb-javatar.rb),然后在 Ruby 解释程序中运行。
结束语在全新的 Rails 应用程序中重用已有的遗留 Java 代码其实非常简单,方式如下:
  • 安装 Java SDK 和 RJB。
  • 将 JAVA_HOME 和 LD_LIBRARY_PATH 环境变量导出到您的 Rails 应用程序的 environment.rb 文件中。
  • 在应用程序中包括 rjb 库。
  • 通过指定希望使用的 JAR 文件,装载 RJB 和 JVM。
  • 从希望使用的 JAR 文件中将类导入到 Ruby 变量并创建类的对象。
  • 开始在 Rails 应用程序中使用刚刚创建的类,就像使用任何 Ruby 对象一样。
如果希望在 Rails 应用程序中重用已经使用 Java 代码实现的业务逻辑,RJB 非常有用,并且不需要使用 Ruby 重新实现。它同时提供了 Ruby on Rails 和 Java 编程的优点。
考虑替代方法还可以使用一种称为 JRuby 的替代方法,它可以实现与 RJB 相同的目标。JRuby 是使用 Java 语言实现的完整的 Ruby 包,使 Ruby 能够运行在 JVM 之上(参见 )。使用 JRuby,您可以访问所有 Java 库。JRuby 要求安装特定于 JRuby 的 Ruby Gems,因为针对非 Java 的 Ruby 的普通 Ruby Gems 不能与 JRuby 兼容。
RJB 和 JRuby 各有优缺点。对于 JRuby,Ruby 全部在 JVM 之上运行,每个 Ruby 调用将经过 JVM,这将使执行变得非常缓慢。同样,如果已经设置了一个 Rails 应用程序,需要从头开始设置,以便 JRuby 访问 Java 代码。作为原生 Ruby 包,RJB 易于安装,并且可以在已有的 Rails 设置中使用。如果需要在您的 Rails 应用程序中快速调用一些 Java 代码片段,那么 RJB 是最好的选择。
整体而言,在 Rails 应用程序中重用遗留 Java 代码的能力非常有用。使用 Java 语言实现的设计和编写都非常良好的业务逻辑不会搁置不用,相反,可以在新的 Web 应用程序中继续发挥有用的功能。
返回列表