将 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 可以理解的内容,然后再返回。
只需在方法中指定一个 Object
或 IRubyObject
参数签名,当您从 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 端调用的用例.
如何将 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 可以理解的内容,然后再返回。
只需在方法中指定一个 Object
或 IRubyObject
参数签名,当您从 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 端调用的用例.