BeanShell (bsh) 是純 Java 實現的動態腳本引擎,支持:
# 1. 圖形化控制台 java bsh.Console # 2. 命令行交互 java bsh.Interpreter # 3. 執行腳本文件 java bsh.Interpreter script.bsh [args...]
// 強類型 (Java 風格)
int add(int a, int b) { return a + b; }
// 弱類型 (腳本風格) - 同一方法處理多類型
add(a, b) { return a + b; }
print(add(1, 2)); // 3
print(add("Hello", "World")); // "HelloWorld"
print(add(new Date(), 1000)); // 日期加毫秒 (若支持)
// 匿名內部類語法實現接口
ActionListener listener = new ActionListener() {
actionPerformed(event) {
print("Button clicked: " + event.getActionCommand());
}
};
// 部分實現:未定義方法拋出异常
// 通用處理:invoked 方法攔截所有調用
MouseListener ml = new MouseListener() {
mousePressed(event) { print("Pressed: " + event); }
invoke(name, args) { print("Unhandled: " + name); }
};
import bsh.Interpreter;
import bsh.EvalError;
public class ScriptEngine {
private final Interpreter interpreter = new Interpreter();
public void init() throws EvalError {
// 1. 向腳本暴露 Java 對象
interpreter.set("appContext", this);
interpreter.set("userService", new UserService());
// 2. 預加載通用腳本
interpreter.source("classpath:scripts/common.bsh");
}
public Object execute(String script) {
try {
return interpreter.eval(script);
} catch (EvalError e) {
throw new RuntimeException("Script execution failed", e);
}
}
// 業務方法可被腳本調用
public void notifyAdmins(String msg) { /* ... */ }
}
// 腳本示例: dynamicRule.bsh
// userService.createUser("admin", "123456");
// appContext.notifyAdmins("New user registered");
BeanShell vs Groovy vs Java Scripting API (JSR-223)
| 特性 | BeanShell | Groovy | Nashorn (JS) |
|---|---|---|---|
| Java 語法兼容 | 高 (子集) | 高 (超集) | 低 (JS 語法) |
| 性能 | 中 | 高 (靜態編譯) | 高 (JIT) |
| 生態成熟度 | 低 (維護緩慢) | 高 | 中 (JDK 15 移除) |
| 適用場景 | 輕量嵌入、Java 開發者友好 | DSL、構建腳本、完整應用 | 前端共享邏輯、Polyglot |
參考資源:BeanShell 官網 | JSR-274 規范