Java SE 6新特性: 对脚本语言的支持 - 编程入门网
通过 getEngineFactories() 函数,ScriptEngineManager 会返回一个包含当前环境中被发现的所有实现 ScriptEngineFactory 接口的具体类,通过这些工厂类中保存的脚本引擎信息检索需要的脚本引擎。第三方提供的脚本引擎实现的 Jar 包中除了包含 ScriptEngine 接口的实现类之外,还需要提供 ScriptEngineFactory 接口的实现类,以及一个 javax.script.ScriptEngineFactory 文件用于指明这个工厂类。这样,Java 平台就能通过 ScriptEngineManager 寻找到这个工厂类,并通过这个工厂类为用户提供一个脚本引擎实例。Java SE 6 默认提供了 JavaScirpt 脚本引擎的实现,如果需要支持其他脚本引擎,需要将它们对应的 Jar 包包含在 classpath 中,比如对于前面 清单 2 中的代码,只需在运行程序前将 Groovy 的脚本引擎添加到 classpath 中,然后运行: java RunScript groovy run.groovy 无需修改一行 Java 代码就能以 Groovy 脚本引擎来运行 Groovy 脚本。在 这里 为 Java SE 6 提供了许多著名脚本语言的脚本引擎对 JSR 223 的支持,这些 Jar 必须和脚本引擎配合使用,使得这些脚本语言能被 Java 平台支持。到目前为止,它提供了至少 25 种脚本语言的支持,其中包括了 Groovy、Ruby、Python 等当前非常流行的脚本语言。这里需要再次强调的是,负责创建 ScriptEngine 实例的 ScriptEngineFactory 实现类对于用户来说是不可见的,ScriptEngingeManager 实现负责与其交互,通过它创建脚本引擎。 Java SE 6新特性: 对脚本语言的支持(4)时间:2011-02-15 IBM 邱小侠脚本引擎的运行上下文 如果仅仅是通过脚本引擎运行脚本的话,还无法体现出 Java 脚本 API 的优点,在 JSR 223 中,还为所有的脚本引擎定义了一个简洁的执行环境。我们都知道,在 Linux 操作系统中可以维护许多环境变量比如 classpath、path 等,不同的 shell 在运行时可以直接使用这些环境变量,它们构成了 shell 脚本的执行环境。在 javax.script 支持的每个脚本引擎也有各自对应的执行的环境,脚本引擎可以共享同样的环境,也可以有各自不同的上下文。通过脚本运行时的上下文,脚本程序就能自由的和 Java 平台交互,并充分利用已有的众多 Java API,真正的站在“巨人”的肩膀上。javax.script.ScriptContext 接口和 javax.script.Bindings 接口定义了脚本引擎的上下文。 Bindings 接口: 继承自 Map,定义了对这些“键-值”对的查询、添加、删除等 Map 典型操作。Bingdings 接口实际上是一个存放数据的容器,它的实现类会维护许多“键-值”对,它们都通过字符串表示。Java 应用程序和脚本程序通过这些“键-值”对交换数据。只要脚本引擎支持,用户还能直接在 Bindings 中放置 Java 对象,脚本引擎通过 Bindings 不仅可以存取对象的属性,还能调用 Java 对象的方法,这种双向自由的沟通使得二者真正的结合在了一起。 ScriptContext 接口: 将 Bindings 和 ScriptEngine 联系在了一起,每一个 ScriptEngine 都有一个对应的 ScriptContext,前面提到过通过 ScriptEnginFactory 创建脚本引擎除了达到隐藏实现的目的外,还负责为脚本引擎设置合适的上下文。ScriptEngine 通过 ScriptContext 实例就能从其内部的 Bindings 中获得需要的属性值。ScriptContext 接口默认包含了两个级别的 Bindings 实例的引用,分别是全局级别和引擎级别,可以通过 GLOBAL_SCOPE 和 ENGINE_SCOPE 这两个类常量来界定区分这两个 Bindings 实例,其中 GLOBAL_SCOPE 从创建它的 ScriptEngineManager 获得。顾名思义,全局级别指的是 Bindings 里的属性都是“全局变量”,只要是同一个 ScriptEngineMananger 返回的脚本引擎都可以共享 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |