将JRuby对象传递给Java方法?

时间:2015-02-16 09:29:02

标签: java jruby

如何将一个JRuby对象(它是一个非常简单的对象,包含一些字符串和Hash类型的字段)传递给Java类中定义的方法?

这里的UPD是我需要在JRuby和Java代码之间共享的类型的序列化内容:

--- !ruby/object:LogStash::Event cancelled: false data: &1 message: "q\r" '@version': '1' '@timestamp': 2015-02-17 12:10:17.695000000 Z type: human accessors: !ruby/object:LogStash::Util::Accessors store: *1 lut: type: - *1 - type host: - *1 - host 该对象由JRuby端创建。理想情况下,我可以直接从Java访问此对象并进行修改。理想情况下,我需要将其转换为Java可以理解的东西然后再回来。

1 个答案:

答案 0 :(得分:1)

只需在方法中指定一个ObjectIRubyObject参数签名,当您从Ruby脚本调用Java方法时它就可以正常工作...

UPDATE :假设LogStash::Event您可以使Java签名接受(IRubyObject event)而不是使用event.callMethod("cancelled?").isTrue()和类似的Java端OR:

...如果您在Java端只需要@data,那么内部Ruby Hash可以很容易retrieved使用:event.to_hash将此传递给接受{{1的Java签名您可以轻松地检索(Map<String, ?> eventData)甚至更新数据eventData.get("message")它将在Ruby端反映,而无需额外的工作,因为Ruby哈希实现了Map接口,因此无需转换即可传递(它将内部处理简单的Ruby到Java字符串转换和类似的自动魔术)

否则(为了理智)我建议引入一个简单的桥接对象,它将事件包装传递给Java并处理你需要在Java端调用的用例。