2013/02/16 このエントリーをはてなブックマークに追加 はてなブックマーク - Javaからスクリプト呼び出し

Javaからスクリプト呼び出し

カテゴリ: , , , ,







知らなかったので、メモ。
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でスクリプトを実行するのはなかなか不思議な感じですね!

コメントを投稿