我正在围绕 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::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
我意识到在 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/