代码之家  ›  专栏  ›  技术社区  ›  user626528

将JRuby对象传递给Java方法?

  •  0
  • user626528  · 技术社区  · 11 年前

    如何将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访问这个对象并修改它。

    1 回复  |  直到 11 年前
        1
  •  1
  •   kares    11 年前

    只需指定 Object 或 IRubyObject 参数签名,当您从Ruby脚本调用Java方法时,它将正常工作。。。

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

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

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