2015-02-16 6 views
0

Как передать объект JRuby (это довольно простой объект, содержащий несколько полей строки и типа Hash) методу, определенному в классе Java?Передача объектов JRuby методам 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

просто указать Object или IRubyObject аргумент подписи в методе, и он будет работать нормально при вызове метода Java из вашего сценария Ruby, ...

UPDATE: Если предположить, что LogStash::Event вы можете сделать Java подпись принимают (IRubyObject event) и чем использовать event.callMethod("cancelled?").isTrue() и подобное на стороне Java ИЛИ:

... если вы в основном нужна только его @data на стороне Java внутренний рубин Hash может быть легко retrieved с помощью: event.to_hash передать это в Java си gnature accepting (Map<String, ?> eventData) вы можете легко получить eventData.get("message") и даже обновить данные eventData.put("message", 42), это будет отражено на стороне Ruby без дополнительной работы, так как Ruby hashes реализует интерфейс Map и, таким образом, будет передаваться без преобразования (он будет внутренне обрабатывать простую строку Ruby to Java преобразование и аналогичные авто-магические)

В противном случае (для здравомыслия) Я бы рекомендовал ввести простой объект-мост, который бы перенесет событие в Java и обрабатывать прецеденты, необходимые для вызова на стороне Java.

+0

И как я могу читать мои значения, если это просто объект? – user626528

+0

Ваш вопрос немного расплывчатый на данном этапе - должен был указать полный прецедент ... по существу «IRubyObject» имеет API, например. 'callMethod', вам может потребоваться сохранить экземпляр runtime Ruby (в зависимости от того, как вы начали внедрять JRuby) – kares

+0

Я вызываю Java-код из приложения JRuby, а не наоборот. Мне нужно передать объект Map на этот Java-код, чтобы он мог его модифицировать. – user626528

Смежные вопросы