我可以在ruby中定义Java子类,然后在Java中实例化它吗?

时间:2012-07-20 12:37:17

标签: jruby

我想在Java中定义一个超类,然后在Ruby中定义一个子类,然后在Java中创建该子类的实例。有点像这样:

// Java superclass
package myPkg;

public class Sup{
  public Sup(){}
  public abstract void foo(String a);
}

-

# Ruby code
include Java
require 'jruby/core_ext'

include_class 'myPkg.Sup'

class RubySub < Java::myPkg.Sup
  def foo( a )
    puts a;
  end
end

RubySub.become_java!
RubySub

-

// Back in Java land
Ruby runtime =  Ruby.newInstance();
IRubyObect ro = runtime.evalScriptlet(theRubyCodeAbove);
Class<Sup> clz = (Class<Sup>) JavaEmbedUtils.rubyToJava(runtime, ro, Class.class);
clz.newInstance().foo("Hey!");

我已经尝试了上面的代码,但是我从newInstance()调用中得到了一个InstantiationException。我希望在运行时在Ruby中声明类,例如运行jrubyc以提前将Ruby代码编译为Java类定义。我在这里做错了什么?

我在调试器中运行了底部代码段,我肯定会从evalScriptlet()调用返回一个RubyClass对象。也许还有一个额外的步骤可以将RubyClass变成Class


更新:我有a lead - 如果该类是Java类的子类,显然become_java!不起作用。还有另外一种方法可以做到这一点,还是我刚刚结账?

1 个答案:

答案 0 :(得分:3)

我现在想出一个解决方法,但它并不漂亮。

简而言之:由于JRUBY-6105,我无法返回RubySub.become_java!nil)或尝试返回RubySub并从{{1}转换}到RubyClass

相反,我返回Class,显示为RubySub.method(:new)。我可以调用它,它创建一个RubyMethod,它实际上是子类的一个实例。这可以使用IRubyObject强制转换为Java超类。就像我说的那样,它并不漂亮,但它有效。