首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDK 6 腳本語言支援 (JSR 223) 完整實戰指南

     編輯:Java 相關知識

核心價值

JDK 6 引入 javax.script 套件 (JSR 223),將腳本引擎標準化嵌入 JVM。預設內建 Mozilla Rhino 實作 JavaScript,任意 JSR 223 相容引擎 (Groovy, JRuby, Jython 等) 均可即插即用。

三大應用場景

  1. 動態配置/規則引擎:將業務規則、數學表達式外部化為腳本
  2. 快速原型開發:Edit-Run 週期取代 Edit-Compile-Run
  3. 應用擴展點:用戶自訂腳本擴展核心功能 (如遊戲 MOD、報表模板)

Scripting API 核心類別

  • ScriptEngineManager:引擎發現與管理入口
  • ScriptEngine:腳本執行上下文,核心方法 eval(), put(), get()
  • Invocable:介面,支援呼叫腳本函式、實現 Java 介面
  • Compilable:介面,支援腳本預編譯提升效能

完整功能演示

import javax.script.*;

public class ScriptingDemo {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript"); // 或 "js"

        // 1. 基礎執行
        engine.eval("print('Hello, Scripting')");

        // 2. 暴露 Java 物件為全域變數
        File f = new File("test.txt");
        engine.put("file", f);
        engine.eval("println('Total Space: ' + file.getTotalSpace())");

        // 3. 呼叫腳本函式
        engine.eval("function hello(name) { return 'Hello, ' + name; }");
        Invocable inv = (Invocable) engine;
        Object result = inv.invokeFunction("hello", "Scripting");
        System.out.println("Result: " + result);

        // 4. 腳本實現 Java 介面
        engine.eval("var runner = { run: function() { println('Script run()'); } };");
        Runnable r = inv.getInterface(engine.get("runner"), Runnable.class);
        new Thread(r).start();

        // 5. 腳本使用 JDK 類別 (Swing 範例)
        String swingScript = "function showFrame(title) {" +
            "var JFrame = Packages.javax.swing.JFrame;" +
            "var f = new JFrame(title);" +
            "f.setSize(400,300); f.setVisible(true); }";
        engine.eval(swingScript);
        inv.invokeFunction("showFrame", "Scripting Swing");
    }
}

關鍵技術細節

Packages 全域物件

腳本中透過 Packages.java.lang.System 存取 Java 套件,java.lang 可簡寫為 java.lang (Rhino 特有)。

執行緒安全

ScriptEngine 非執行緒安全,多執行緒環境需每執行緒建立實例或同步控制。

效能優化

  • 實作 Compilable 的引擎可預編譯:CompiledScript cs = ((Compilable)engine).compile(script); cs.eval();
  • 重複使用編譯後腳本避免重複解析

命令列工具:jrunscript

$ jrunscript
js> println("Hello")
Hello
js> 9*8
72.0
js> new javax.swing.JFrame("Test").setVisible(true)

適用於快速驗證腳本邏輯、互動式探索 Java API、批次執行 .js 檔案。

自訂腳本引擎開發

實作 ScriptEngineFactory 與 ScriptEngine (建議繼承 AbstractScriptEngine),打包為 JAR,在 META-INF/services/javax.script.ScriptEngineFactory 註冊實現類名稱,即可被 ScriptEngineManager 自動發現。

總結

JSR 223 將 JVM 變為多語言運行平台,Java 應用獲得動態性、擴展性與多語言互操作能力。善用腳本外部化業務邏輯,能顯著降低系統耦合度與部署成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved