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

Java 整合 Rhino 引擎執行 JavaScript:雙向互調完整範例

     編輯:Java 相關知識

前言

Rhino 是 Mozilla 純 Java 實現的 JavaScript 引擎,常用於規則引擎、腳本化配置、動態業務邏輯。本文示範 Java 調用 JS 函數、JS 調用 Java 方法的完整流程。

1. 依賴引入

<dependency>
    <groupId>org.mozilla</groupId>
    <artifactId>rhino</artifactId>
    <version>1.7.14</version>
</dependency>

2. 核心工具類

import org.mozilla.javascript.*;

public class RhinoExecutor {
    public static Object execute(String jsCode, String functionName, Object[] args) {
        Context cx = Context.enter();
        cx.setOptimizationLevel(-1); // 解釋模式,避免類加載問題
        try {
            Scriptable scope = cx.initStandardObjects();
            // 暴露 Java 物件給 JS
            ScriptableObject.putProperty(scope, "javaHelper", Context.javaToJS(new JavaHelper(), scope));
            
            cx.evaluateString(scope, jsCode, "script", 1, null);
            Function func = (Function) scope.get(functionName, scope);
            if (func == null) throw new RuntimeException("Function not found: " + functionName);
            return func.call(cx, scope, scope, args);
        } finally {
            Context.exit();
        }
    }
    
    // 供 JS 調用的 Java 類
    public static class JavaHelper {
        public String sayHello(String name) {
            return "Hello from Java, " + name;
        }
        public int add(int a, int b) {
            return a + b;
        }
    }
}

3. Java 調用 JS 函數

String jsCode = "function greet(name) { return 'JS says: ' + name; }";
Object result = RhinoExecutor.execute(jsCode, "greet", new Object[]{"World"});
System.out.println(result); // JS says: World

4. JS 調用 Java 方法

String jsCode = 
    "var helper = javaHelper;" +
    "function callJava() {" +
    "  return helper.sayHello('Rhino');" +
    "}";
Object result = RhinoExecutor.execute(jsCode, "callJava", new Object[]{});
System.out.println(result); // Hello from Java, Rhino

5. Android 環境特殊處理

Android 預設不包含 Rhino,需額外引入 rhino-android 或使用內建 WebView.evaluateJavascript / JavascriptInterface。若必須用 Rhino,請確保:

  • 引入 rhino-1.7.14.jar 並啟用 MultiDex。
  • 避免使用 Context.enter() 導致的執行緒安全問題,改用 ContextFactory。

6. 現代替代方案:GraalVM JavaScript

<dependency>
    <groupId>org.graalvm.js</groupId>
    <artifactId>js</artifactId>
    <version>22.3.0</version>
</dependency>

// 用法類似,效能更優、支援 ES2023
Context ctx = Context.create();
Value jsFunc = ctx.eval("js", "function add(a,b){return a+b;}");
int sum = jsFunc.execute(1, 2).asInt();

7. 安全性與效能提醒

  • 不可信腳本需開啟沙箱:限制 java.lang.System、java.io.File 等敏感類訪問。
  • 重用 Context 與 Scriptable 減少初始化開銷。
  • 大量腳本執行考慮編譯緩存 CompiledScript(JSR-223)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved