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()
ます。RubyClass
a を aに変換するための追加の手順が含まれている可能性がありClass
ます。
更新: 私はリードbecome_java!
を持っています -クラスが Java クラスのサブクラスである場合、どうやら動作しません。これを行う別の方法はありますか、それとも骨が折れただけですか?