Java SE 6 新特性: 对脚本语言的支持

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

使用脚本引擎运行脚本

Java 脚本 API 通过脚本引擎来运行脚本,整个包的目的就在于统一 Java 平台与各种脚本引擎的交互方式,制定一个标准,Java 应用程序依照这种标准就能自由的调用各种脚本引擎,而脚本引擎按照这种标准实现,就能被 Java 平台支持。每一个脚本引擎就是一个脚本解释器,负责运行脚本,获取运行结果。ScriptEngine 接口是脚本引擎在 Java 平台上的抽象,Java 应用程序通过这个接口调用脚本引擎运行脚本程序,并将运行结果返回给虚拟机。

ScriptEngine 接口提供了许多 eval 函数的变体用来运行脚本,这个函数的功能就是获取脚本输入,运行脚本,最后返回输出。清单 1 的例子中直接通过字符串作为 eval 函数的参数读入脚本程序。除此之外,ScriptEngine 还提供了以一个 java.io.Reader 作为输入参数的 eval 函数。脚本程序实质上是一些可以用脚本引擎执行的字节流,通过一个 Reader 对象,eval 函数就能从不同的数据源中读取字节流来运行,这个数据源可以来自内存、文件,甚至直接来自网络。这样 Java 应用程序就能直接利用项目原有的脚本资源,无需以 Java 语言对其进行重写,达到脚本程序与 Java 平台无缝集成的目的。清单 2 即展示了如何从一个文件中读取脚本程序并运行,其中如何通过 ScriptEngineManager 获取 ScriptEngine 实例的细节会在后面详细介绍。

清单 2. Run Script

                public class RunScript {    public static void main(String[] args) throws Exception {        String script = args[0];        String file = args[1];               FileReader scriptReader = new FileReader(new File(file));        ScriptEngineManager manager = new ScriptEngineManager();        ScriptEngine engine = manager.getEngineByName(script);        engine.eval(scriptReader);    }}

清单 2 代码,从命令行分别获取脚本名称和脚本文件名,程序通过脚本名称创建对应的脚本引擎实例,通过脚本名称指定的脚本文件名读入脚本程序运行。运行下面这个命令,就能在 Java 平台上运行所有的 JavaScript 脚本。

java RunScript javascript run.js

通过这种方式,Java 应用程序可以把一些复杂易变的逻辑过程,用更加灵活的弱类型的脚本语言来实现,然后通过 javax.Script 包提供的 API 获取运行结果,当脚本改变时,只需替换对应的脚本文件,而无需重新编译构建项目,好处是显而易见的,即节省了开发时间又提高了开发效率。

EngineScript 接口分别针对 String 输入和 Reader 输入提供了三个不同形态的 eval 函数,用于运行脚本:

表 1. ScriptEngine 的 eval 函数函数描述Object eval(Reader reader) 从一个 Reader 读取脚本程序并运行Object eval(Reader reader, Bindings n) 以 n 作为脚本级别的绑定,从一个 Reader 读取脚本程序并运行Object eval(Reader reader, ScriptContext context) 在 context 指定的上下文环境下,从一个 Reader 读取脚本程序并运行Object eval(String script) 运行字符串表示的脚本Object eval(String script, Bindings n) 以 n 作为脚本级别的绑定,运行字符串表示的脚本Object eval(String script, ScriptContext context) 在 context 指定的上下文环境下,运行字符串表示的脚本

Java 脚本 API 还为 ScriptEngine 接口提供了一个抽象类 ―― AbstractScriptEngine,这个类提供了其中四个 eval 函数的默认实现,它们分别通过调用 eval(Reader,ScriptContext) 或 eval(String, ScriptContext) 来实现。这样脚本引擎提供者,只需继承这个抽象类并提供这两个函数实现即可。AbstractScriptEngine 有一个保护域 context 用于保存默认上下文的引用,SimpleScriptContext 类被作为 AbstractScriptEngine 的默认上下文。关于上下文环境,将在后面进行详细介绍。

[1][2][3][4][5][6]

有些人注定是等待别人的,有些人是注定被人等的。

Java SE 6 新特性: 对脚本语言的支持

相关文章:

你感兴趣的文章:

标签云: