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

时间:2012-01-27 11:21:00

标签: jruby

我正在围绕ruby gem编写一个Java包装器库,所以我在Java中嵌入ruby,而不是相反。我似乎是少数人!

如果我有一个返回Time对象的ruby方法,那么我可以很容易地将它转换为Java端的java.util.Date对象,如下所示:

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

但我认为我很幸运通过反复试验来解决这个问题,并不是所有看似类似的类型都能以这种方式转换。我有另一个ruby方法返回一个URI对象(实际上可能是URI::HTTPURI::HTTPS)但是尝试将显而易见的(给定上面的)转换为{{1} }不起作用(我也尝试了java.net.URI):

java.net.URL

此代码编译,但在运行时失败:

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

我意识到在ruby中Exception in thread "main" org.jruby.exceptions.RaiseException: (TypeError) cannot convert instance of class org.jruby.RubyObject to class java.net.URI 实际上是一个模块,URI等是类,所以我并不完全惊讶上面的内容不起作用。但是URI::HTTPS / Time示例显然有一些内部的“魔力”,所以我想知道是否为其他类型提供了类似的转换,哪些类型以及它们的记录位置。

任何指针都非常赞赏。

1 个答案:

答案 0 :(得分:4)

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby说“转换类型 - Ruby转换为Java - 请参阅JRuby rspec源代码目录spec/java_integration以获取更多示例。 [examples,...]”

果然,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

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