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());
文章来源于领测软件测试网 https://www.ltesting.net/