如何将一个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可以理解的东西然后再回来。
答案 0 :(得分:1)
只需在方法中指定一个Object
或IRubyObject
参数签名,当您从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端调用的用例。