Java SE 6 中新增的 Java 腳本編程 API 為運行用各種動態語言編寫的外部程序(并與之共享代碼和數據)提供了一種統一的方式。Java 應用程序與腳本語言的強大功能和靈活性相結合是非常有意義的,尤其是在腳本語言能夠更簡潔地執行某些任務的情況下。但是,Java 腳本編程 API 不僅僅能夠以一種統一的方式在 Java 程序中添加許多種腳本語言代碼,它還支持在運行時尋找、讀取和執行腳本?梢岳眠@些動態功能在程序運行時修改腳本,從而修改應用程序的邏輯。本文演示如何使用 Java 腳本編程 API 調用外部腳本來動態地修改程序邏輯。還要討論在將一種或多種腳本語言集成到 Java 應用程序中時可能遇到的問題。
第 1 部分 用一個 Hello World 風格的應用程序介紹了 Java 腳本編程 API。這里將展示一個更真實的示例應用程序,這個程序使用腳本編程 API 創建一個動態的規則引擎,它可以以外部 Groovy、JavaScript 和 Ruby 腳本的形式定義規則。這些規則決定申請人是否符合某些抵押產品的住宅貸款條件。如果用腳本語言定義業務規則,規則就更容易編寫,也便于非程序員(比如貸款審查員)閱讀。通過使用 Java 腳本編程 API 將這些規則放在程序之外,還可以支持在應用程序運行時修改規則和添加新的抵押產品。
真實的應用程序
這個示例應用程序為虛構的 Shaky Ground Financial 公司處理住宅貸款申請。住宅抵押行業不斷地推出新的貸款產品,還常常修改對合格申請人的限制規則。Shaky Ground 公司不但希望能夠快速地添加和刪除抵押產品,還需要快速修改業務規則,從而控制哪些人符合產品的貸款條件。
Java 腳本編程 API 正好能夠滿足這種需求。這個應用程序由一個 ScriptMortgageQualifier 類組成,這個類負責判斷打算購買某一資產的貸款人是否符合給定的抵押貸款產品的條件。清單 1 給出這個類。
清單 1. ScriptMortgageQualifier 類
// Imports and Javadoc not shown.
public class ScriptMortgageQualifier {
private ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
public MortgageQualificationResult qualifyMortgage(
Borrower borrower,
Property property,
Loan loan,
File mortgageRulesFile
) throws FileNotFoundException, IllegalArgumentException, ScriptException
{
ScriptEngine scriptEngine = getEngineForFile(mortgageRulesFile);
if (scriptEngine == null) {
throw new IllegalArgumentException(
"No script engine on classpath to handle file: " + mortgageRulesFile
);
}
// Make params accessible to scripts by adding to engine's context.
scriptEngine.put("borrower", borrower);
scriptEngine.put("property", property);
scriptEngine.put("loan", loan);
// Make return-value object available to scripts.
MortgageQualificationResult scriptResult = new MortgageQualificationResult();
scriptEngine.put("result", scriptResult);
// Add an object scripts can call to exit early from processing.
scriptEngine.put("scriptExit", new ScriptEarlyExit());
文章來源于領測軟件測試網 http://www.kjueaiud.com/