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")); // 30Invocable 接口
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());
}