JRuby:Java 和 Ruby 类型/类之间的映射/转换的文档?

标签 jruby

我正在围绕 ruby​​ gem 编写一个 Java 包装器库,因此我将 ruby​​ 嵌入到 Java 中,而不是相反。我似乎是极少数!

如果我有一个返回 Time 的 ruby​​ 方法对象然后我可以很容易地将它转换为 java.util.Date Java端的对象是这样的:

public Date getStartTime() {
    IRubyObject result = RuntimeHelpers.invoke(runtime.getCurrentContext(),
        this, "start_time");
    return (Date) result.toJava(Date.class);
}

但我想我很幸运通过反复试验解决了这个问题,并不是所有看起来相似的类型都可以通过这种方式转换。我有另一个返回 URI 的 ruby​​ 方法对象(实际上可能是 URI::HTTPURI::HTTPS),但尝试将明显的(鉴于上述)转换为 java.net.URI不起作用(我也试过 java.net.URL ):

public URI getUri() {
    IRubyObject result = RuntimeHelpers.invoke(runtime.getCurrentContext(),
        this, "uri");
    return (URI) result.toJava(URI.class);
}

此代码编译,但在运行时失败:
Exception in thread "main" org.jruby.exceptions.RaiseException: (TypeError) cannot
convert instance of class org.jruby.RubyObject to class java.net.URI

我意识到在 ruby 中 URI实际上是一个模块和URI::HTTPS , etc 是类,所以我对上述方法不起作用并不感到惊讶。但是,Time 显然有一些内部“魔法”。/Date示例所以我想知道是否为其他类型提供了类似的转换,哪些类型以及它们记录在哪里。

任何指针都非常感谢。

最佳答案

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby说“类型转换 – Ruby 到 Java – 有关更多示例,请参见 JRuby rspec 源代码目录 spec/java_integration。[示例,...]”。

果然, coercion_spec.rb 包含许多示例/规范。这是您已经使用的案例:

describe "Time\"to_java" do
  describe "when passed java.util.Date" do
    it "coerces to java.util.Date" do
      t = Time.now
      d = t.to_java(java.util.Date)
      d.class.should == java.util.Date
    end
  end

  # [...]
end

我相信这是目前可用的最好的文档。

关于JRuby:Java 和 Ruby 类型/类之间的映射/转换的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032544/

相关文章:

ruby-on-rails - 如何设置 pdftk 或 iText 以在 Heroku 上使用 Rails 3?

JRuby - Tempfile.rb

Windows 7 上的 JRuby 错误

ruby-on-rails - 如何为Windows安装Nokogiri Gem

java - 从 JRuby 调用 Java 代码片段?

java - 从 Ruby 调用 Java 程序

jruby - 将 JRuby 字符串转换为 Java 字节数组,然后再返回

ruby - Neo4j 服务器锁定数据库。为什么?

hadoop - 在哪里可以找到安装和运行 cascading.jruby 的教程?