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

2023-12-19

我想在 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()称呼。我想在运行时在 Ruby 中声明该类,例如提前运行 jrubyc 将 Ruby 代码编译为 Java 类定义已经过时了。我在这里做错了什么?

我已经运行了调试器中的底部代码段,并且我肯定得到了从evalScriptlet()称呼。也许需要一个额外的步骤来转变RubyClass into a Class?


更新:我有a lead http://jira.codehaus.org/browse/JRUBY-6105- 显然become_java!如果该类是 Java 类的子类,则不起作用。我还有其他方法可以做到这一点,还是我只是骨头?


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

简而言之:我无法回来RubySub.become_java!(这是nil, 因为JRUBY-6105 http://jira.codehaus.org/browse/JRUBY-6105)或尝试返回RubySub并从 a 转换RubyClass to a Class.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 ruby​​ 中定义 Java 子类,然后在 Java 中实例化它吗? 的相关文章

随机推荐