3

我想在 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 类定义已经过时了。我在这里做错了什么?

我已经在调试器中运行了底部代码段,并且肯定会从调用中返回一个 RubyClass 对象evalScriptlet()。也许需要一个额外的步骤来将 aRubyClass变成 a Class


更新:我有一个线索——如果该类是 Java 类的子类,则显然become_java!不起作用。有没有另一种方法可以做到这一点,或者我只是被骨头?

4

1 回答 1

3

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

简而言之:我无法返回RubySub.become_java!(即nil,由于JRUBY-6105)或尝试返回RubySub并从 a 转换RubyClass为 a Class

相反,我返回RubySub.method(:new),它显示为RubyMethod。我可以调用它,它创建一个IRubyObject实际上是子类的实例。这可以使用JavaEmbedUtils.rubyToJava(). 就像我说的,它不漂亮,但它有效。

于 2012-07-20T14:26:19.563 回答