JRuby:Java和Ruby类型/类之间的映射/转换的文档?
问题描述:
我正在围绕一个红宝石宝石编写一个Java包装库,所以我在Java中嵌入了ruby,而不是其他方式。我似乎在广大的少数民族!JRuby:Java和Ruby类型/类之间的映射/转换的文档?
如果我有一个返回Time
对象,然后红宝石的方法,我可以很容易地转换成在Java端这样的java.util.Date
对象:
public Date getStartTime() {
IRubyObject result = RuntimeHelpers.invoke(runtime.getCurrentContext(),
this, "start_time");
return (Date) result.toJava(Date.class);
}
但我觉得我很幸运,由工作了这一点试验和错误,而不是所有类似的类型都可以通过这种方式进行转换。我有一个返回URI
对象的另一个红宝石方法(它可能是一个URI::HTTP
和事实URI::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
我意识到,在红宝石URI
实际上是一个模块和URI::HTTPS
等都是类,所以我并不完全感到惊讶的是,上面没有工作。但是对于Time
/Date
例子显然有一些内部“魔力”,所以我想知道是否为其他类型提供了类似的转换,哪些类型和它们在哪里被记录。
任何指针非常赞赏。
答
https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby说 “类型的转换 - 红宝石到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
我相信这是目前可用的最好的文档。
这是个好地方,谢谢。当然,当我从Java调用Ruby时,我并不认为要在文档的“一侧”上看!之后,我设法向JRuby添加了足够的代码,用于将Ruby URI类自动强制到Java URI对象中,但这很难,需要做大量工作才能“正确完成” - 如果它适合做到这一点那样。 – 2012-04-11 20:50:42