Java知識點總結(動態執行JS代碼 )

Java知識點總結(動態執行JS代碼 )

@(Java知識點總結)[Java, 動態字節碼操做]javascript

JDK6.0以後提供了腳本引擎功能,讓咱們能夠執行某些腳本語言,特別是javascript(javascript是一門解釋性語言,動態性很是好)。java

讓JAVA的動態性獲得更充分的體現,某些時候能夠更加靈活的應對需求的變化。python

腳本引擎介紹:
  • 使得 Java 應用程序能夠經過一套固定的 接口與各類腳本引擎 交互,從而達到在 Java 平臺上調用各類腳本語言的目的 。
  • Java 腳本 API 是連通 Java 平臺和腳本語言 的 橋樑 。
  • 能夠把一些複雜異變的業務邏輯交給腳本語言處理,這又大大提升了開發效率。
Java 腳本 API 爲開發者提供了以下功能:
  • 獲取腳本程序輸入,經過腳本引擎運行腳本並返回運行結果,這是最核心的接口。函數

    • 注意是:接口。 Java能夠使用各類不一樣的實現,從而通用的調用 js 、 groovy 、 python 等腳本。
  • 經過 腳本引擎 的運行上下文在腳本和 Java 平臺間交換數據。
  • 經過 Java 應用程序調用腳本函數。
JS腳本引擎Rhino

Rhino 是一種使用 Java 語言編寫的 JavaScript 的開源實現,原先由Mozilla開發,如今被集成進入JDK 6.0。
官方首頁.net

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.util.List;
 
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class Test09 {
 
  // 定義變量,存儲到引擎上下文中
  private static void test1(ScriptEngine engine) {
 
    engine.put("msg", "張三是個好學生");
    System.out.println(engine.get("msg")); // 獲取變量的值
 
    try {
     engine.eval("msg='java是門好用的語言';"); // 修改變量的值
    } catch (ScriptException e1) {
     e1.printStackTrace();
    }
    System.out.println(engine.get("msg"));
  }
 
  // 定義一個對象
  private static void test2(ScriptEngine engine) {
    String str = "var user = {name:'張三',age:18,subjects:['計算機','英語']};";
    str += "println(user.name);";
    try {
     engine.eval(str);
    } catch (ScriptException e) {
     e.printStackTrace();
    }
  }
 
  // 定義一個函數
  private static void test3(ScriptEngine engine) {
 
    try {
     engine.eval("function add(a,b){var sum = a+b;return sum;}");
    } catch (ScriptException e) {
     e.printStackTrace();
    }
 
    try {
     // 取得調用接口
     Invocable jsInvoke = (Invocable) engine;
     // 執行腳本中定義的方法
     Object result = jsInvoke.invokeFunction("add", new Object[] { 13, 20 });
     System.out.println(result);
    } catch (NoSuchMethodException | ScriptException e) {
     e.printStackTrace();
    }
  }
 
  // 導入其餘java包,使用其餘包中的java類
  private static void test4(ScriptEngine engine) {
 
    String jsCode = "importPackage(java.util); var list = Arrays.asList([\"浙江大學\",\"清華大學\",\"北京大學\"]); ";
    try {
     engine.eval(jsCode);
    } catch (ScriptException e) {
     e.printStackTrace();
    }
    List<String> list2 = (List<String>) engine.get("list");
    for (String temp : list2) {
     System.out.println(temp);
    }
 
  }
 
  //執行一個js文件(咱們將a.js至於項目的src下便可)
  private static void test5(ScriptEngine engine) {
        URL is = Test09.class.getClassLoader().getResource("a.js");
        Reader r= null;
    try {
     r = new FileReader(is.getPath());
     engine.eval(r);
    } catch (FileNotFoundException | ScriptException e) {
     e.printStackTrace();
    }finally {
     try {
       r.close();
     } catch (IOException e) {
       e.printStackTrace();
     }  
    }
  }
 
  public static void main(String[] args) {
 
    // 得到腳本引擎
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine engine = sem.getEngineByName("javascript");
 
    test1(engine);
    test2(engine);  // java 8 出現異常:Caused by: <eval>:1 ReferenceError: "println" is not defined
    test3(engine);
    test4(engine);  // java 8出現異常:Caused by: <eval>:1 ReferenceError: "importPackage" is not defined
    test5(engine);
  }
 
}
相關文章
相關標籤/搜索