将 JRuby 对象传递给 Java 方法?

Passing JRuby objects to Java methods?

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

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 可以理解的内容,然后再返回。

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

UPDATE:假设 LogStash::Event 你可以让 Java 签名接受 (IRubyObject event) 而不是使用 event.callMethod("cancelled?").isTrue() 和Java 方面类似或:

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

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