2003-01-12 今日はXMLマスターの試験
@ [xml] Forrestを使ってみる (3)
ページの左側のメニューは、src/documentation/content/xdocsディレクトリ以下のbook.xmlから生成されている。このディレクトリの下にサブディレクトリがある場合は、そのサブディレクトリ下にもbook.xmlを作ると、メニューが生成される。
@ [xml] Forrestを使ってみる (4)
左上のタブはtab.xmlを作成することによって生成される。これをsrc/documentation/content/xdocsディレクトリ以下に用意しておくと、タブが生成される。
[ツッコミを入れる]
2005-01-12
@ [java][ruby] JRubyを使ってみる(3)
Rubyで定義したクラスをJava側から使用出来ないか試してみました。JRubyはBSFを実装しているので、スクリプトを評価した結果をJavaで受け取ることが出来ます。まずは下記のclass.rbを作ってみます。
class Foo
def hello
return "Hello world!"
end
end
Foo.new
スクリプトの最後でFoo.newしているのは、JavaからBSFManager#evalした時に戻り値を得るためです。これがないとただのクラスの定義になってしまうので、evalの結果がnullになります。
Java側のコードは下記のようになります。examples/jrubyというパッケージの下にRuby2Java.javaとして作成しておきます。
package examples.jruby;
import java.io.*;
import org.apache.bsf.BSFManager;
import org.jruby.RubyObject;
import org.jruby.javasupport.JavaUtil;
import org.jruby.runtime.builtin.IRubyObject;
/**
* RubyオブジェクトのメソッドをJavaから呼んでみるテスト。
*/
public class Ruby2Java {
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("Usage: java examples.jruby.Ruby2Java FILE");
System.exit(1);
}
new Ruby2Java().execute(args[0]);
}
private void execute(String file) throws Exception {
BSFManager.registerScriptingEngine(
"ruby", "org.jruby.javasupport.bsf.JRubyEngine", new String[] { "rb" });
BSFManager manager = new BSFManager();
String script = loadScript(file);
System.out.println("--- script ---");
System.out.println(script);
Object result = manager.eval("ruby", "(java)", 1, 1, script);
IRubyObject foo = (IRubyObject)result;
// Foo#helloを呼ぶ
IRubyObject ro = foo.callMethod("hello");
String message = (String)JavaUtil.convertRubyToJava(ro, String.class);
System.out.println("message = " + message);
}
private String loadScript(String file) throws IOException {
BufferedReader r = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
for (String line = r.readLine(); line != null; ) {
sb.append(line);
sb.append("\n");
line = r.readLine();
}
return sb.toString();
}
}
実行してみます。
$ java -classpath lib/bsf.jar:lib/jruby.jar examples.jruby.Ruby2Java class.rb
--- script ---
class Foo
def hello
return "Hello world!"
end
end
Foo.new
message = Hello world!
おお! Fooクラスのインスタンスメソッドhelloをちゃんと呼び出せていますね。
本日のツッコミ(全2件) [ツッコミを入れる]
# 前の会社の人 [い、いかん。コーダーがヨーダーと読めてしまった。]
# おいぬめ [そう言われてみれば...病気ですね(笑)]