色々なスクリプトをヒアドキュメントで書いて、そのまま実行するJRuby
via http://d.hatena.ne.jp/t_yano/20070403/1175612738
http://headius.blogspot.com/2007/03/can-your-ruby-do-this.html
試しに、素のJavaで簡単に書けないか考えてみました。こんなのはどうでしょ?しかし、見た目的にいまいちですね・・・。
public class ScriptTester { public String x = "Hello"; public String y = "World!"; public void call() { String script = "z = 'multilanguage';" + "println(outer.x + ',' + z + ' ' + outer.y);"; Scriptable s = new Scriptable("outer"); s.js(script, this); } public static void main(String[] args) { new ScriptTester().call(); } }
ちなみに、Scriptableクラスは以下のようになってます。ちょっと頑張れば、privateなフィールドやメソッドをバインドするのも可能です。また、javascriptしか対応していないのは、JavaSE6が標準で対応しているのが、javascriptだけなのです^^; この辺りは、AOPを使ったりして減gの毎のインターフェイスを自動生成できたら嬉しいかも?
import javax.script.*; public class Scriptable { private final String namespace_; public Scriptable(String namespace) { namespace_ = namespace; } public void js(String script, Object invoker) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); if (engine == null) { System.out.println("js script is not found!"); return; } Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); bindings.put(namespace_, invoker); try { engine.eval(script); } catch (ScriptException ex) { ex.printStackTrace(); } } }