我想在 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(使用前将#替换为@)