BSFのJavaEngine

鳥団子

引数BSFManagerひとつ(引数名bsf)のメソッドの中身として、入力式の文字列をテンプレート置換
*.javaソースファイル生成
javacコマンドダイレクトコールで *.classファイル生成
ClassLoader.loadClass でload


JavaEngineのソースのヘッダ部分にも書いてあったけれど、なんのことはない。やってることはたったこれだけだった。JSPみたいだぁね。もっともJSPみたいに定義済み変数の展開をしてくれるわけでもなく、importの制御もかけられないけど。単純に置換してるだけなので、BSF呼び出し側で定義したbeanにアクセスするには、引数のBSFManagerを介するしかない。スクリプト側からBSF呼び出し側に渡したい(戻したい)場合はともかく、BSF呼び出し側から渡されたbeanに関しては、ローカル変数として生成ソース上に展開くらいしてくれても良いのにと思った。なんだかな。


追記:JavaEngineのソース見てたら、自分が思っていたような展開を行うコードが、きちんと記述されていた。コメントアウトされてたけれど。

package bsf;

import org.apache.bsf.*;

public class BsfTest
{
	public static void main(String[] args)
	throws Exception
	{
		BSFManager bsf = new BSFManager();
		bsf.registerBean("hoge", new Integer(10));

		Object r = bsf.eval("java", null, 1, 1
			, "return bsf.getObjectRegistry().lookup(\"hoge\");");
		System.out.println(r);
	}
}

BSF JavaEngine呼び出し部分

import java.lang.*;import java.util.*;public class BSFJava1 {
  static public Object BSFJavaEngineEntry(org.apache.bsf.BSFManager bsf) {
return bsf.getObjectRegistry().lookup("hoge");
  }
}

BSFが自動生成したソース