BSFさんとJRubyさん

BSF(http://jakarta.apache.org/bsf/index.html)を使ってみたよ。その時のメモ。

JavaからRubyへ値を渡す

Java側で『declareBean(名前, 値, 値の型)』を呼んでやると、Ruby側からは『$名前』でアクセスできるようになる。

// JRubyエンジンを登録
BSFManager.registerScriptingEngine("jruby", "org.jruby.javasupport.bsf.JRubyEngine", null);
BSFManager manager = new BSFManager();
// System.outを $outとして定義
manager.declareBean("out", System.out, System.out.getClass());
// スクリプトを実行
String script = "$out.println 'hello jruby!!'";
manager.eval("jruby", // スクリプトエンジンに、先ほど登録した "ruby"を指定 
             "", // スクリプトファイル名(空でOK)
             1,  // 開始行(とりあえず1で)
             1,  // 開始カラム(とりあえず1で)
             script);

RubyからJavaへ値を返す

// register JRubyEngile
BSFManager.registerScriptingEngine("jruby", "org.jruby.javasupport.bsf.JRubyEngine", null);		
BSFManager manager = new BSFManager();		
// declare x
manager.declareBean("x", new Integer(10), Integer.class);		
// eval script
String script = "$x * $x";
Object result = manager.eval("jruby", "", 1, 1, script);
// evalの結果を出力
System.out.println(result);
==> 100