动态调用动态语言之Java脚本API
来源:网络 更新时间:2014-12-16
我们不需要将动态语言编译为Java字节码就可以在Java应用程序中使用它们。使用JavaPlatform,StandardEdition6(JavaSE)中添加的脚本包(并且向后兼容JavaSE5),Java代码可以在运行时以一种简单的、统一的方式调用多种动态语言。本系列文章共分两个部分,第1部分将介绍Java脚本API的各种特性。文章将使用一个简单的HelloWorld应用程序展示Java代码如何执行脚本代码以及脚本如何反过来执行Java代码。第2部分将深入研究Java脚本API的强大功能。
Java开发人员清楚Java并不是在任何情况下都是最佳的语言。今年,1.0版本的JRuby和Groovy的发行引领了一场热潮,促使人们纷纷在自己的Java应用程序中添加动态语言。Groovy、JRuby、Rhino、Jython和一些其他的开源项目使在所谓的脚本语言中编写代码并在JVM中运行成为了可能(请参阅参考资料)。通常,在Java代码中集成这些语言需要对各种解释器所特有的API和特性有所了解。
JavaSE6中添加的javax.script包使集成动态语言更加容易。通过使用一小组接口和具体类,这个包使我们能够简单地调用多种脚本语言。但是,Java脚本API的功能不只是在应用程序中编写脚本;这个脚本包使我们能够在运行时读取和调用外部脚本,这意味着我们可以动态地修改这些脚本从而更改运行应用程序的行为。
Java脚本API
脚本与动态的对比
术语脚本通常表示在解释器shell中运行的语言,它们往往没有单独的编译步骤。术语动态通常表示等到运行时判断变量类型或对象行为的语言,往往具有闭包和连续特性。一些通用的编程语言同时具有这两种特性。此处首选脚本语言是因为本文的着重点是Java脚本API,而不是因为提及的语言缺少动态特性。
2006年10月,Java语言添加了脚本包,从而提供了一种统一的方式将脚本语言集成到Java应用程序中去。对于语言开发人员,他们可以使用这个包编写粘连代码(gluecode),从而使人们能够在Java应用程序中调用他们的语言。对于Java开发人员,脚本包提供了一组类和接口,允许使用一个公共API调用多种语言编写的脚本。因此,脚本包类似于不同语言(比如说不同的数据库)中的JavaDatabaseConnectivity(JDBC)包,可以使用一致的接口集成到Java平台中去。
以前,在Java代码中,动态调用脚本语言涉及到使用各种语言发行版所提供的独特类或使用Apache的JakartaBeanScriptingFramework(BSF)。BSF在一个API内部统一了一组脚本语言(请参阅参考资料)。使用JavaSE6脚本API,二十余种脚本语言(AppleScript、Groovy、JavaScript、Jelly、PHP、Python、Ruby和Velocity)都可以集成到Java代码中,这在很大程序上依赖的是BSF。
脚本API在Java应用程序和外部脚本之间提供了双向可见性。Java代码不仅可以调用外部脚本,而且还允许那些脚本访问选定的Java对象。比如说,外部Ruby脚本可以对Java对象调用方法,并访问对象的属性,从而使脚本能够将行为添加到运行中的应用程序中(如果在开发时无法预计应用程序的行为)。
调用外部脚本可用于运行时应用程序增强、配置、监控或一些其他的运行时操作,比如说在不停止应用程序的情况下修改业务规则。脚本包可能的作用包括:
·在比Java语言更简单的语言中编写业务规则,而不用借助成熟的规则引擎。
·创建插件架构,使用户能够动态地定制应用程序。
·将已有脚本集成到Java应用程序中,比如说处理或转换文件文章的脚本。
·使用成熟的编程语言(而不是属性文件)从外部配置应用程序的运行时行为。
·在Java应用程序中添加一门特定于域的语言(domain-specificlanguage)。
·在开发Java应用程序原型的过程中使用脚本语言。
·在脚本语言中编写应用程序测试代码。