java動態編程-Rhino腳本引擎

java 6.0提供一些標準接口來操作腳本語言,它讓java有能力在代碼中,動態的執行腳本語言,接口的實現就由第三方來實現。Rhino引擎是一個實現javascript腳本接口的第三方實現,java6.0之後,默認引入,作爲java的jar包。

簡單使用見下面的例子

/**
 * RhinoDemo引擎demo
 * @author liuxg
 * @date 2016年5月24日 上午10:30:37
 */
public class RhinoDemo {

    public static void main(String[] args) throws Exception {

        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine se = sem.getEngineByName("javascript");

        //使用上下文,執行eval之後,js的變量和函數都存儲於上下文,通過get和put可以獲取和保存變量,java和javascript都可以使用同一個上下文
        se.put("myame", "liuxg !!");
        System.out.println(se.get("myame"));

        se.eval("var yourname = 'who are you ?'");
        System.out.println(se.get("yourname"));

        //執行變量
        String script = "var compo = {addr : \"廣州\",tel : \"12345678901\"};";
        script += "println(compo.addr + \" : \" + compo.tel)";
        se.eval(script);

        //執行js函數
        String funscript = "function sum(a,b){return a + b ;}";
        se.eval(funscript);
        Invocable jsInvocable = (Invocable)se;
        Object obj = jsInvocable.invokeFunction("sum", 1,2);
        System.out.println("sum = " + obj);

        //執行js文件
        URL url = RhinoDemo.class.getClassLoader().getResource("rhino.js");//獲取classpath下的js文件
        FileReader reader = new FileReader(url.getFile());
        se.eval(reader);
        Object obj1 = jsInvocable.invokeFunction("skyscolor");
        System.out.println(se.get("skycolor") + " -- " + obj1);

        //js和java代碼混合用
        String jsjavacode =  "importPackage(java.util); var names = Arrays.asList(\"liuxg1\",\"liuxg2\",\"liuxg3\")";
        se.eval(jsjavacode);
        List<String> names = (List<String>) se.get("names");
        for (String name : names) {
            System.out.println(name);
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章