test01.js: javascript
if(age>=18){ print('Old enough to vote!'); }else{ print('Back to school!'); }
test02.js: java
if(age<25){ riskFactor = 1.5; }else if(noClaims){ ristFactor = 0.75; }else{ ristFactor = 1.0; }
test03.js: 函數
function Hello(){} Hello.prototype.sayHello = function(value) { println('hello!'+value); } Hello.prototype.increment = function(value) { return i+1; } var hello = new Hello(); hello.sayHello('World1');
Hello.java: spa
package com.hjr.demo.util.js; public interface Hello { public int increment(int value); public void sayHello(String name); }ScriptEngineDemo.java:
package com.hjr.demo.util.js; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; import java.io.PrintWriter; import javax.script.*; public class ScriptEngineDemo { public static void main(String[] args) throws Exception { test10(); } // 使用腳本引擎運行腳本程序 public static void test01() throws ScriptException { // 若是調用者可訪問線程上下文 ClassLoader,則調用此構造方法的效果與調用 ScriptEngineManager(Thread.currentThread().getContextClassLoader()) 相同 // ScriptEngineManager檢索感興趣的腳本編寫的語言的ScriptEngine對象 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.put("age", 26); engine.eval("if(age>=18){println('Old enough to vote!');}else{println('Back to school!');}"); } // 使用腳本引擎執行外部資源中的腳本 public static void test02() throws FileNotFoundException, ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.put("age", 26); engine.eval(new FileReader("E:/ScriptEngine/test01.js"));// 對文件或其它外部資源中得腳本表達式進行求值 } // 使用腳本引擎檢索結果 public static void test03() throws FileNotFoundException, ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.put("age", 26); engine.put("noClaims", Boolean.TRUE); Object result = engine.eval(new FileReader("E:/ScriptEngine/test02.js"));// eval()函數返回執行腳本後所返回的值,默認狀況下,將返回上次執行的表達式的值 System.out.println(result.toString()); } // 上下文屬性的做用域 public static void test04() throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); Bindings globalBindings = manager.getBindings(); // 屬於ScriptEngineManager的全局上下文,每一個ScriptEngineManager擁有一個Bindings globalBindings.put("name", "yangYong"); ScriptEngine engine = manager.getEngineByName("js"); Bindings globalBindings02 = engine.getBindings(ScriptContext.GLOBAL_SCOPE); // 每一個引擎都共有一個ScriptEngineManager的Bindings System.out.println("name=" + globalBindings02.get("name")); System.out.println(globalBindings == globalBindings02); ScriptContext context = engine.getContext(); // 每一個引擎都有本身獨立的scriptContext上下文 Bindings engineDefaultBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); // 每一個引擎的scriptContext中都有個默認屬於本身的Bindings engineDefaultBindings.put("gender", "男"); engine.eval("name2 = name;println(name2);", engineDefaultBindings); engineDefaultBindings.put("name", "zhangSan"); engine.eval("name2 = name;println(name2)", engineDefaultBindings); Bindings engineCreateBindings = engine.createBindings(); // 每一個引擎的scriptContext中也能夠新建多個屬於本身的Bindings engineCreateBindings.put("gender", "女"); System.out.println(engineDefaultBindings == engineCreateBindings); System.out.println(engine.getBindings(ScriptContext.ENGINE_SCOPE)); System.out.println(engineCreateBindings.get("gender")); engine.eval("name2 = name;println(name2)", engineCreateBindings); } // java應用程序與腳本交互 public static void test05() throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Bindings bindings = engine.createBindings(); // Bindings:KV對映射,用來在Java應用程序和javascript腳本之間交換信息,即上下文 bindings.put("age", 26); bindings.put("noClaims", Boolean.TRUE); bindings.put("riskFactor", 1.0); engine.eval("if(age<25){riskFactor = 1.5;}else if(noClaims){ristFactor = 0.75;}else{ristFactor = 1.0;}", bindings);//必須綁定bindings執行腳本,不然報變量未定義異常 double risk = (Double) bindings.get("riskFactor"); System.out.println(risk); } // 腳本內部訪問java資源 public static void test06() throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.eval("importPackage(java.util)"); engine.eval("today = new Date();println(today)"); engine.put("name", "ZhangSan"); engine.eval("name2 = name.toUpperCase();println(name2);"); } // 重定向腳本輸出 public static void test07() throws IOException, ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); PipedReader pr = new PipedReader(); PipedWriter pw = new PipedWriter(pr); // 用戶能夠經過與這個 PrintWriter 連通的 PrintReader 讀取實際的輸出,使 Java 應用程序能獲取腳本運行輸出 PrintWriter out = new PrintWriter(pw); engine.getContext().setWriter(out); engine.eval("println('hello from javascript!');"); BufferedReader br = new BufferedReader(pr); System.out.println(br.readLine()); } // 可編譯且可調用的引擎 public static void test08() throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); if (engine instanceof Compilable) { // 判斷腳本引擎是否支持編譯操做 Compilable compilable = (Compilable)engine; CompiledScript script = compilable.compile("if(age<25){riskFactor = 1.5;}else if(noClaims){ristFactor = 0.75;}else{ristFactor = 1.0;}"); Bindings bindings = engine.createBindings(); bindings.put("age", 26); bindings.put("noClaims", Boolean.TRUE); bindings.put("riskFactor", 1.0); Object result = script.eval(bindings); System.out.println(result.toString()); } } // 調用腳本中的函數和方法 public static void test09() throws ScriptException, NoSuchMethodException, FileNotFoundException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.eval("function increment(i){return i+1;}"); if (engine instanceof Invocable) { // 判斷腳本引擎是否支持編譯操做 Invocable invocable = (Invocable)engine; // Invocable容許從java代碼調用定義在腳本中的單個函數 Object result = invocable.invokeFunction("increment", new Object[]{10}); // 調用腳本中定義的頂層程序和函數 System.out.println("result = "+result); } ScriptEngine engine2 = manager.getEngineByName("js"); engine2.eval(new FileReader("E:/ScriptEngine/test03.js")); if (engine2 instanceof Invocable) { Invocable invocable = (Invocable)engine2; invocable.invokeMethod(engine2.get("hello"), "sayHello", "yangYong"); // 對之前的腳本執行中已經編譯的腳本對象(以 ScriptEngine 的狀態保持)調用某一方法 } } // 調用腳本中的函數和方法並將他們做爲java程序中的接口實現 public static void test10() throws FileNotFoundException, ScriptException { /** * TODO 這個用例存在問題,待處理 */ ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.eval("function increment(i){return i+1;}"); if (engine instanceof Invocable) { Invocable invocable = (Invocable)engine; Hello hello = invocable.getInterface(Hello.class); // 返回一個接口的實現,該接口使用解釋器中編譯的函數 Object result = hello.increment(2); System.out.println("result = " + result); } engine.eval(new FileReader("E:/ScriptEngine/test03.js")); if (engine instanceof Invocable) { Invocable invocable2 = (Invocable)engine; Hello hello = invocable2.getInterface(engine.get("hello"), Hello.class); // 返回一個接口的實現,該接口使用解釋器中已編譯腳本對象的成員函數 hello.sayHello("zhangSan"); } } }