博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Nashorn--Part 4
阅读量:4365 次
发布时间:2019-06-07

本文共 2177 字,大约阅读时间需要 7 分钟。

Nashorn 和 javax.script 包

Nashorn 并不是第一个在 Java 平台上运行的脚本语言。在Java 6 就提供了 javax.script java 包,它为脚本语言引擎提供了一个通用的与Java交互的接口。

这个通用接口包含了脚本语言的基本概念,如脚本代码的执行和编译。此外,引入了Java 和脚本实体之间的注解绑定。最后,javax.script 包为调用提供了可选支持(这不同于执行,因为它允许从一个脚本语言的运行时导出中间代码,供 JVM 运行时使用)。
Rhino 作为一个实例语言,在 Java 8 中已经被移除,现在 Java 平台提供的默认的脚本提供为 Nashorn。

介绍 javax.script 和 Nashorn 的使用

让我们看一个很简单的例子,如何使用 Nashorn 从 Java 中运行 JavaScript:

import javax.script.*;ScriptEngineManager m = new ScriptEngineManager();ScriptEngine e = m.getEngineByName("nashorn");try {  e.eval("print('Hello World!');");} catch (final ScriptException se) {  // ...}

这里的关键概念是ScriptEngine接口,是从ScriptEngineManager中获取的。 这提供了一个空的脚本环境,我们可以通过eval() 方法添加JavaScript 代码。

Nashorn 引擎提供了一个单一的全局 JavaScript 对象,因此所有对eval() 的调用都将在同一个环境中执行。 这意味着我们可以在脚本引擎中进行一系列eval() 调用和构建 JavaScrip 的状态。 例如:

e.eval("i = 27;"); e.put("j", 15); e.eval("var z = i + j;"); System.out.println(((Number) e.get("z")).intValue()); // prints 42

注这里需要注意的一个问题是,直接从 Java 与脚本引擎交互,我们通常不会取得任何关于值的类型的信息。

Nashorn 对大多数 Java 类型保持相当紧密的绑定,所以我们需要小心。 当处理 JavaScript 的基本类型时,在 Java 中通常会转换成对应的包装类。 例如,如果我们将以下行代码添加到上一个示例中:

System.out.println(e.get("z").getClass());

我们很容易地发现返回值是java.lang.Integer类型,我们稍作一下修改:

e.eval("i = 27.1;"); e.put("j", 15); e.eval("var z = i + j;"); System.out.println(e.get("z").getClass());

那么这时e.get(“z”)的返回值的类型 java.lang.Double,这标记了两种类型系统之间的区别。 在 JavaScript 的其他实现中,这些都将被视为数字类型(因为 JavaScript 不定义整数类型)。 然而,Nashorn 更加意识到数据的实际类型。

注意:

当处理 JavaScript 时,Java 程序员必须有意识地知道 Java 的静态类型和 JavaScript 类型的动态之间本质的区别。 如果没有意识到这一点,bug 就很有可能产生。

在我们的例子中,我们在 ScriptEngine 上使用 了get() 和 put() 方法。 这些方法允许我们在 Nashorn 引擎执行的脚本的全局范围内直接获取和设置对象,而不必直接编写或评估 JavaScript 代码。

javax.script API

让我们在这一部分中简要描述 javax.script API 中的一些关键的类和接口。 这些只是其中相当小的API(六个接口,五个类和一个异常类),自从 Java 6 中引入以来没有改变。

  • ScriptEngineManager
    脚本支持的入口点。 它在此过程中维护可用脚本实现的列表。这是通过 Java 的服务提供程序机制实现的,这是一种非常通用的方式来管理具有不同的实现的平台扩展。 默认情况下,唯一可用的脚本扩展是Nashorn,尽管其他脚本环境(如Groovy 或JRuby)也可以使用。
  • ScriptEngine
    这个类代表我们负责维护解释执行脚本环境的引擎。
  • Bindings
    此接口扩展Map接口,并提供字符串(变量或其他符号的名称)和脚本对象之间的映射。 Nashorn 使用它来实现 ScriptObjectMirror 机制的互操作性。

在实践中,大多数应用程序处理由 ScriptEngine上 的方法(如eval(),get() 和put())提供的相对不透明的接口,但是了解这个接口如何插入到整个脚本 API 的机理还是很有必要。

转载于:https://www.cnblogs.com/IcanFixIt/p/6403110.html

你可能感兴趣的文章
通俗易懂系列 | 设计模式(五):策略模式
查看>>
三核CPU XP系统终极安装SQL 2005
查看>>
SQL语句查询优化续集
查看>>
(四)ServletConfig
查看>>
连接数据库修改篇
查看>>
说说面向对象
查看>>
mybatis学习笔记
查看>>
使用淘宝 NPM 镜像
查看>>
zabbix 乱码的问题
查看>>
Swift 学习之二十一:?和 !(详解)
查看>>
Laravel
查看>>
二分图匹配
查看>>
Day032--Python--操作系统, process进程
查看>>
highcharts-Highmaps 动态传入城市名称
查看>>
english interview
查看>>
寒假222_codeforces 290 div 2 D
查看>>
open-falcon(v0.2)部署手册(源码编译)
查看>>
大明A+B(hdu1753)大数,java
查看>>
局部变量&&malloc函数&&生命周期的一些见解
查看>>
springboot打jar包,调用webservice出错
查看>>