在 Ruby on Rails 应用程序中重用 Java 代码
2009-11-20 00:00:00 来源:WEB开发网调用方法并捕获结果
将类装载到 Ruby 并从中创建了对象后,下一步是调用需要的方法并查看结果。例如,您希望使用 TarArchive 类的 extractContents 方法,将样例文件(test.tar)的内容提取到当前目录中。
和构造函数一样,可以使用两种方式调用方法。一种方式是直接调用方法,例如:
tararchive_instance.extractContents(file_instance)
当方法重载后,使用 _invoke 调用指定方法的每个参数的类型签名:
tararchive_instance._invoke('extractContents', 'Ljava.io.File;', file_instance)
这一步可以使 RJB 知道在方法重载时应该调用哪些方法。
和对待普通 Ruby 代码一样,您将捕获对象方法返回的结果(如果有的话),并在自己的应用程序中使用结果。方法调用返回的结果被自动转换为相应的对象类型。您只需在对象内直接调用方法。
Java TarArchive 类中实现的功能现在可以用于您的 Ruby 代码。通过使用相同的方法,Java 代码中已实现的任何功能可以不加修改地在您的 Ruby 和 Rails 应用程序中重用。
完整的代码
清单 2 展示了本教程示例的完整 Ruby 代码(也可以通过 下载 获得):
清单 2. 完整的示例 Ruby 代码# 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...'
更多精彩
赞助商链接