Можете ли вы вызывать скомпилированные классы JRuby из java?

Поэтому мне пришла в голову общая идея написать код на JRuby, а затем получить доступ ко всем классам через Java. Я понятия не имею, возможно ли это вообще, но я все равно хотел спросить. Допустим, у меня есть код JRuby:

class adder
   def addme
      return 22
   end
end

Если бы я скомпилировал это с помощью jrubyc, я мог бы сделать что-то подобное в java:

import adder;
class anything {
    void testMethod() 
    {
       adder a = new adder();
       int x = a.addme();
    }
 }

Посмотрев на это сейчас, я думаю, что Java не будет иметь никакого представления о том, какой тип тестового элемента будет возвращаться, поэтому это может не сработать. Я не знаю, но я все равно хотел выбросить его туда.

Спасибо


person Matthew Stopa    schedule 04.05.2010    source источник


Ответы (3)


На самом деле в JRuby 1.5 есть новый способ сделать это! Ваш вопрос очень своевременен. Вот пример сеанса:

http://gist.github.com/390342

Мы надеемся, что очень скоро у нас будет сообщение в блоге с подробным описанием этой новой функции. В вики JRuby есть несколько предварительных документов:

http://wiki.jruby.org/GeneratingJavaClasses

person Charles Oliver Nutter    schedule 05.05.2010

На самом деле есть два способа вызвать ruby-код из java. Первый из них медленнее, но вы можете изменить его во время выполнения, чтобы вызвать скриптовый движок, как из этого ссылка. но что касается того, как вы это сделали, jrubyc компилирует ruby ​​​​в javaBytecode, что означает, что java увидит его как код java

jrubyc adder.rb --java Компиляция файла "adder.rb" как класса "Adder.class"

и так же, как вы сделали ...

поэтому вы бы назвали его как любой другой класс Java

import org.jruby.RubyObject

Adder ad = new Adder();

RubyObject ro = ad.addme();

ресурс

person jtzero    schedule 04.05.2010
comment
К сожалению, это не сработало для меня. Не удалось найти метод addme(). Это определенно там, и это общедоступно, поэтому я не знаю, почему - person Matthew Stopa; 05.05.2010

Это возможно с пакетом для встраивания в JRuby, но я думаю, как это выходит за рамки ответа здесь. Проверьте это: http://kenai.com/projects/jruby/pages/RedBridge

person Affe    schedule 04.05.2010
comment
Однако это не вызов методов, а использование контейнера. - person Matthew Stopa; 05.05.2010