JDK1.8中如何用ScriptEngine動態執行JS


JDK1.8中如何用ScriptEngine動態執行JS

jdk1.6開始就提供了動態腳本語言諸如JavaScript動態的支持。這無疑是一個很好的功能,畢竟Java的語法不是適合成為動態語言。而JDK通過執行JavaScript腳本可以彌補這一不足。這也符合“Java虛擬機不僅僅是Java一種語言的虛擬機“這一目標。

ScriptEngine功能強大,基本能實現筆者所能想到的Java與JavaScript交互的需求。而且十分的方便簡潔。jdk1.8又對ScriptEngine接口進行了一定改變,因此,在jdk1.8能運行的代碼,在1.6中可能會報錯,反之亦然。

下面通過具體的代碼講解:

import java.util.Map;
import java.util.TreeMap;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;

import jdk.nashorn.api.scripting.ScriptObjectMirror;

public class JSEngine {
    public static ScriptEngine engine;
    private static String str;
    //該函數測試Java獲取JS變量值的能力
    public static void getJsValue() throws Exception{
        str = "  var msg='hello';          "
            + "  var number = 123;         "
            + "  var array=['A','B','C'];  "
            + "  var json={                "
            + "      'name':'pd',          "
            + "      'subjson':{           "
            + "           'subname':'spd'  "
            + "           ,'id':123        "
            + "           }                "
            + "      };                    ";
        //執行語句
        engine.eval(str);
        str="msg+=' world';number+=5";
        //再次執行
        engine.eval(str);
        //獲取js變量msg(String類型)
        System.out.println(engine.get("msg"));
        //獲取js變量msg(int類型)
        System.out.println(engine.get("number"));
        //獲取js變量array(數組)
        ScriptObjectMirror array=(ScriptObjectMirror) engine.get("array");
        //getSlot(int index)函數用於獲取下標為index的值
        System.out.println(array.getSlot(0));
        //獲取js變量json(json類型)
        ScriptObjectMirror json=(ScriptObjectMirror) engine.get("json");
        //get(String key)函數用於鍵key的值
        System.out.println(json.get("name"));
        //獲取js變量subjson(嵌套json類型)
        ScriptObjectMirror subjson=(ScriptObjectMirror)json.get("subjson");
        System.out.println(subjson.get("subname"));
    }
    //該函數測試Java與js對象
    public static void getObject() throws Exception{
        str = "  var obj=new Object();     "
            + "  obj.info='hello world';   "
            + "  obj.getInfo=function(){   "
            + "        return this.info;   "
            + "  };                        ";
        engine.eval(str);
        //獲取對象
        ScriptObjectMirror obj=(ScriptObjectMirror) engine.get("obj");
        //輸出屬性
        System.out.println(obj.get("info"));
        System.out.println(obj.get("getInfo"));
        str="obj.getInfo()";
        //執行方法
        System.out.println(engine.eval(str));
    }
    //java將變量導入js腳本
    public static void putValue() throws Exception{
        str="Math.pow(a,b)";
        Map<String, Object>input=new TreeMap<>();
        input.put("a",2);
        input.put("b",8);
        System.out.println(engine.eval(str,new SimpleBindings(input)));
    }
    //調用js函數
    public static void callJsFunction() throws Exception{
           engine.eval("function add (a, b) {return a+b; }");
           Invocable jsInvoke = (Invocable) engine;
           Object res = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
           System.out.println(res);
    }
    public static void main(String[] args) throws Exception {
        //獲取js引擎實例
        ScriptEngineManager sem = new ScriptEngineManager();
        engine=sem.getEngineByName("javascript");
        getJsValue();
        getObject();
        putValue();
        callJsFunction();
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM