脚本语言的一些有用的特性是:
- 方便:大多数脚本语言都是动态类型的。您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的对象。此外,脚本语言往往会自动执行许多类型的转换,例如, 必要时 将数字10转换为“10”。
- 开发快速原型:您可以避免编辑编译运行周期,只使用“编辑运行”!
应用扩展/定制:你可以“具体化”的部分应用程序,例如一些配置脚本,业务逻辑/规则和财务应用中的数学表达式 。 - 为应用添加命令行模式,用于调试、运行时配置/部署时间。现在大多数应用程序都有一个基于Web的GUI配置工具。但是系统管理员/部署人员常常喜欢命令行工具。一个“标准”的脚本语言可以用来实现这个目的,而不是发明特设的脚本语言。
Java 脚本 API 是一种独立于框架的脚本语言,使用来自于Java代码的脚本引擎 。通过java脚本API,可以使用Java语言编写定制/可扩展的应用程序并将自定义脚本语言选择留给最终用户 。Java 应用程序开发者不需要在开发过程中选择扩展语言。如果你使用JSR-223 API来编写应用,那么你的用户可以使用任何JSR-223兼容的脚本语言。
脚本功能是在包中。这是一个比较小的,简单的。脚本的出发点是 类。一个对象可以通过文件的服务发现机制发现脚本引擎。它也可以实例化脚本引擎来解释使用特定的脚本语言编写的脚本。使用脚本编程接口的最简单的方法如下:
创建一个对象
从获取 对象
使用的方法执行脚本
现在,是时候看一些样本代码了。了解一些JavaScript有助于阅读这些例子,但不是强制的。
从ScriptEngineManager实例中,我们通过 getEngineByName 方法得到一个JavaScript引擎实例。通过脚本引擎的eval方法来执行给定的JavaScript代码。为简便起见,本例以及随后的例子中,我们不对异常进行处理。javax.script API有检查和运行时异常,你必须妥善处理异常。
在这个例子中,我们调用方法来接收作为输入源。读入的脚本被执行。这种方式能够成文件执行脚本,用相关的输入流对象读取和资源
当你的应用程序嵌入脚本引擎和脚本,你可能希望将您的应用程序对象为全局变量暴露于脚本中。这个例子演示了如何将您的应用程序对象作为全局变量暴露于脚本中。我们在应用程序中创建一个 对象作为全局变量,名称是。该脚本可以访问变量,例如,它可以调用它的公共方法。注意访问对象、领域和方法的语法依赖于脚本语言。支持最“自然”的类似的语法。
有些时候,你可能需要多次调用一个特定脚本函数,例如你的应用程序菜单功能可能由脚本来实现。在菜单中的操作事件处理程序中,可能需要调用一个特定的脚本函数。下面的示例演示在代码调用一个特定的脚本。
如果你的脚本语言是基于对象(如)或面向对象的,你可以在脚本对象上调用脚本方法。
有些时候通过脚本函数或者方法可以很方便的实现接口,而不是在中调用。同时,通过接口我们可以避免在很多地方使用接口。我们可以得到一个接口实现者对象并将其传递给不同的。下面的例子演示了通过脚本实现接口。
如果你的脚本语言是基于对象或者面向对象的,可以通过脚本对象的脚本方法来实现接口。这避免了不得不调用脚本全局函数的接口方法。脚本对象可以存储接口实现状态。
在例子中,我们看到怎样将应用对象暴露为脚本的全局变量。它有可能暴露为多个全局的作用域 。 单作用域是的实例中. 这个借口派生至。 键值对的集合,其中键为非空、非空字符串。 多是 接口支持的。支持一个或多个脚本上下文与相关的域绑定。默认情况下, 每一个脚本引擎都有一个默认的脚本上下文。 默认的脚本上下文有至少一个域叫 。不同域的脚本上下文支持可以通过方法获取。
的中包含了一个基于脚本引擎。 这个引擎是基于版本为的。多数实现都被包含在内。少部分组件由于大小和安全原因被排除了:
- 转字节码编译 (也称 )。此功能依赖一个类生成库。 去掉本功能意味着:是解释执行,且不影响脚本执行,因为优化器是透明的。
- 的也被去掉了。是一个可扩展类和可实现接口功能。此功能也是需要类生成库的。我们把的替换
为实现的。在的实现中,仅仅实现了对象可实现单接口功能。例如,下面的代码会正确执行。在大多数情况下,是采用匿名类语法来实现单接口。 使用来扩展类或实现多接口并不常见。
- 被去掉了. 使用代码会产生一个语法错误. 请注意,支持标准是可选的-省略E4X的实现是被支持也是兼容 。
- 的命令行工具 没有被包含在内。但你可以用使用来代替。
在大多数情况下,访问、和很简单。从中访问属性和方法与同中一样。这里,我们突出访问的重要方面。更多的细节请阅读。下面是一些访问的代码片段。本节需要一些知识。如果你打算使用中非脚本语言,那么本节可以跳过。
的文件内容如下
需要注意的是上面创建的一个没有添加关闭事件,需要在任务管理器中关闭掉其所以来的 线程。
请注意,不是默认引入的 (与不同),因为会与内置的 , , 等冲突。
和函数”污染” 了JavaScript中的全局变量。为了避免这种情况,你可以使用JavaImporter。
在 中,创建一个对象时与中一样,而创建数组时需要显式的使用反射。但一旦创建好后,访问其中的元素或获取大小就和中一样。 另外,也可以使用脚本数组用在方法中期望的数组(因为可以自动转换)。所以在大多数情况下我们不需要显式地创建数组。
在中,可以使用匿名类语法形式实现中接口:
当接口中只有一个需要实现的方法时,你可以自己传入脚本的函数(因为可以自动转换)。
方法是使用参数类型重载的。在中,重载发生在编译阶段 (执行)。当脚本中调用方法时,脚本的翻译器或编译器需要选择适当的方法。对于引擎,您不需要做任何特别的——正确的方法重载变体是根据参数类型选择的。 但有时,您可能希望(或有)显式地选择一个特定的过载变体。
更多的方法重载细节阅读
参考链接
我们不会覆盖的兼容脚本引擎实现细节. 至少, 您需要实现和接口。 抽象类 提供了一些接口中定义的方法。
在开始实现引擎之前,您可能需要下载工程。这个工程维护了一些流行的开源脚本语言的 实现。
引用
1. JSR-223 Scripting for the Java Platform
2. JavaScript Developer Connection
3. Java Method Overloading and LiveConnect 3
4. Rhino:JavaScript for Java
5. Scripting Java (from JavaScript)
6. scripting.dev.java.net project
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/14412.html