我正在围绕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::HTTP
或URI::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
示例显然有一些内部的“魔力”,所以我想知道是否为其他类型提供了类似的转换,哪些类型以及它们的记录位置。
任何指针都非常赞赏。
答案 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
我相信这是目前最好的文档。