我可以定义红宝石一个Java子类,然后实例化它在Java中?(Can I define a Java

2019-09-19 21:51发布

我想在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!");

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

我已经通过在调试器底部的代码段运行,我肯定让从返回的RubyClass对象evalScriptlet()调用。 也许有涉及到把一个额外的步骤RubyClassClass


更新:我有一个铅 -显然become_java! 如果类是一个Java类的子类不起作用。 有另一种方法,我可以做到这一点,还是我只是去骨?

Answer 1:

我想出了一个解决办法,现在,但它不是漂亮。

简而言之:我无法回报RubySub.become_java! (这是nil ,因为JRUBY-6105 ),或者尝试返回RubySub并从转换RubyClass到一个Class

相反,我返回RubySub.method(:new) ,其显示为一个RubyMethod 。 我可以打电话这一点,它创建了一个IRubyObject这实际上是子类的实例。 这可以使用强制转换为Java的超JavaEmbedUtils.rubyToJava() 就像我说的,这是不漂亮,但它的工作原理。



文章来源: Can I define a Java subclass in ruby, then instantiate it in Java?
标签: jruby