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が自動生成したソース