知らなかったので、メモ。
Java6からJavaソースからスクリプトを呼び出すAPIが標準で
入ってるんですね。。。知らなかった。
javax.scriptというパッケージです。
Java7ではRubyとかGroovyとかに対応してるとかしてないとか。
ちょっと調べてみるとJavascriptを利用しているパターンばっかり出てきてしまいます
ね。
他のスクリプトも試してみるのもいいかもしれないけど、
とりあえずはJavascriptでやってみた。
ソースはこんな感じ。
main
package com.yank.yy.main; import com.yank.yy.action.TestAction; /** * メインクラス * @author yy_yank * */ public class Test{ /** * * メインメソッド * @param args String[] * */ public static void main(String[] args) { TestAction action = new TestAction(); action.doTest(args); } }
Bean
package com.yank.yy.bean; /** * 一般的なBeanクラス * @author yy_yank * */ public class Person { /** 名前*/ private String firstName; /** 苗字 */ private String lastName; /** 年齢 */ private int year; /**コンストラクタ*/ public Person() { } /**コンストラクタ*/ public Person(String firstName, String lastName, int year) { this.setFirstName(firstName); this.setLastName(lastName); this.setYear(year); } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { lastName = lastName; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } }
Action
package com.yank.yy.action; import com.yank.yy.bean.Person; import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.ArrayList; import java.io.FileReader; import java.io.IOException; import javax.script.Bindings; import javax.script.Compilable; import javax.script.CompiledScript; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleBindings; /** * スクリプトのコンパイル及び実行処理を行うクラス * @author yy_yank * */ public class TestAction{ /** * スクリプトのコンパイル及び実行処理 * @param args * */ public void doTest(String[] args){ // マネージャを作る ScriptEngineManager manager = new ScriptEngineManager(); // エンジンをjavascriptに指定してインスタンス取得 ScriptEngine engine = manager.getEngineByName("js"); FileReader fr = null; try { //入力されたファイル数分ループ for (String arg : args) { Bindings bindings = new SimpleBindings(); bindings.put("author",new Person("Ted", "Neward", 39)); bindings.put("title", "5 Things You Didn't Know"); bindings.put("list", this.createList()); bindings.put("map", this.createMap()); bindings.put("num", 1); bindings.put("string", "str"); bindings.put("bool", true); bindings.put("dbl", Double.valueOf(1)); fr = new FileReader(arg); if (engine instanceof Compilable) { System.out.println("Compiling...."); Compilable compEngine = (Compilable) engine; CompiledScript cs = compEngine.compile(fr); cs.eval(bindings); } else{ engine.eval(fr, bindings); } } } catch (ScriptException scrEx) { scrEx.printStackTrace(); } catch (IOException ioEx) { ioEx.printStackTrace(); }finally{ if(fr != null){ try{ fr.close(); }catch(IOException e){ e.printStackTrace(); } } } } /** * Listの生成 * */ private List<String> createList(){ List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); return list; } /** * Mapの生成 * */ private Map<String,String> createMap(){ Map<String , String> map = new HashMap<String,String>(); map.put("a","a"); map.put("b","b"); map.put("c","c"); return map; } }
jsのソース
println("javascriptの内容を出力しています"); println("--------------------Hello from inside scripting!---------------------------"); println("") println("----Java側で作成したPersonクラスオブジェクト(JavaBeans)---"); println("author = " + author); println("author.firstName = " + author.firstName); println("author.lastName = " + author.lastName); println("author.year = " + author.year); println("typeof author = "+typeof author); println("") println("----java.util.List---"); for(var i = 0; i<list.size(); i++){ println("list.get(" + i + ") = " + list.get(i)); } println("typeof list = " + typeof list); println("") println("----java.util.Map---"); println("map = " + map); println("typeof map = " + typeof map); println("") println("----int---"); println("typeof num = " + typeof num); println("num = " + num); println("") println("----string---"); println("typeof string = " + typeof string); println("string = " + string); println("") println("----boolean---"); println("typeof bool = " + typeof bool); println("bool = " + bool); println("") println("----double---"); println("typeof dbl = " + typeof dbl); println("dbl = " + dbl);
javascriptに対してパラメータを差し込むことができるので、
色々な型で試してみた。
軒並み予想される通りの感じで暗黙変換してくれているよう。
実際にDOSから叩いてみるとこんな感じ!
簡単なご紹介でしたー。
1 件のコメント:
こんにちは。
javaでスクリプトを実行するのはなかなか不思議な感じですね!
コメントを投稿