java6內置JS引擎初接觸

yeqinglong8888 9年前發布 | 9K 次閱讀 JavaScript開發

來自: http://blog.csdn.net/sdyy321/article/details/6959199


test01.js:

if(age>=18){  
    print('Old enough to vote!');  
}else{  
    print('Back to school!');  
}

test02.js:

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:

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");
        }  
    }  
}



 本文由用戶 yeqinglong8888 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!