我想在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!
不起作用。还有另外一种方法可以做到这一点,还是我刚刚结账?
答案 0 :(得分:3)
我现在想出一个解决方法,但它并不漂亮。
简而言之:由于JRUBY-6105,我无法返回RubySub.become_java!
(nil
)或尝试返回RubySub
并从{{1}转换}到RubyClass
。
相反,我返回Class
,显示为RubySub.method(:new)
。我可以调用它,它创建一个RubyMethod
,它实际上是子类的一个实例。这可以使用IRubyObject
强制转换为Java超类。就像我说的那样,它并不漂亮,但它有效。