Skip to content

JSR-223 接口

FSScript 实现了 Java 标准的 JSR-223 (javax.script) 接口,可以与任何支持该标准的框架集成。

基本用法

java
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("fsscript");

engine.put("name", "World");
engine.eval("export let greeting = `Hello ${name}!`;");
System.out.println(engine.get("greeting"));  // Hello World!

支持的接口

FSScript 的 ScriptEngine 实现了以下接口:

  • ScriptEngine - 基础脚本执行
  • Compilable - 脚本预编译
  • Invocable - 函数调用

Compilable 接口

java
Compilable compilable = (Compilable) engine;
CompiledScript compiled = compilable.compile("export let sum = a + b;");

Bindings bindings = engine.createBindings();
bindings.put("a", 10);
bindings.put("b", 20);
compiled.eval(bindings);

System.out.println(bindings.get("sum"));  // 30

Invocable 接口

java
engine.eval("""
    function greet(name) {
        return 'Hello, ' + name + '!';
    }
""");

Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("greet", "FSScript");
System.out.println(result);  // Hello, FSScript!

Bindings 作用域

java
// 全局作用域
Bindings globalBindings = engine.getBindings(ScriptContext.GLOBAL_SCOPE);
globalBindings.put("globalVar", "I'm global");

// 引擎作用域
Bindings engineBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
engineBindings.put("engineVar", "I'm engine-scoped");

// 脚本中两者都可访问
engine.eval("export let g = globalVar; export let e = engineVar;");

错误处理

java
try {
    engine.eval("invalid syntax {{");
} catch (ScriptException e) {
    System.err.println("脚本错误: " + e.getMessage());
    System.err.println("行号: " + e.getLineNumber());
    System.err.println("列号: " + e.getColumnNumber());
}