我想在 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!
不起作用。有没有另一种方法可以做到这一点,或者我只是被骨头?