Java6
Java 6 からいつの間にか javax.script パッケージというのが追加されてますね。
何気に Java 6 には Rhino が取り込まれていて Java から JavaScript が使用できるようになっているそうな。
なにげに文字列を eval できるのでクライアントから送られて来た JavaScript をサーバで実行して返すとかできる。
すごくセキュリティホールにつながりそうだけどなんか面白い使いかたないのかなー?
取り合え得ずバージョンを見てみるとか。
import java.util.List; import javax.script.ScriptEngineManager; import javax.script.ScriptEngineFactory; public class ScriptEngineList { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); List<ScriptEngineFactory> factories = manager.getEngineFactories(); for (ScriptEngineFactory factory: factories) { System.out.printf("%s : %s\n", factory.getEngineName(), factory.getEngineVersion()); } } }
こいつを javac でコンパイルして実行してみると
$ java ScriptEngineList Mozilla Rhino : 1.6 release 2
なんつー感じに表示されます。って Rhino 1.6 r2 か…結構古いかも?
ちなみに同じような動作をする JavaScript は
importPackage(java.lang); importPackage(java.util); importPackage(javax.script); var manager = new ScriptEngineManager(); var factories = manager.getEngineFactories(); var it = factories.iterator(); while (it.hasNext()) { var factory = it.next(); print(factory.getEngineName() + " : " + factory.getEngineVersion() + "\n"); }
こんな感じでかけるようです。
JDK付属の jrunscript を使用して
$ jrunscript ScriptEngineList.js Mozilla Rhino : 1.6 release 2
とかやってもいいけど下記のようなプログラムを書いて
import java.io.FileReader; import java.io.FileNotFoundException; import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; public class ScriptDriver { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); try { engine.eval(new FileReader(args[0])); } catch (ScriptException e) { System.out.println(e); } catch (FileNotFoundException e) { System.out.println(e); } } }
$ javac ScriptDriver.java $ java ScriptDriver ScriptEngineList.js Mozilla Rhino : 1.6 release 2
なんてこともできるみたい。