Java Nashorn--Part 4
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 的机理还是很有必要。
Java Nashorn--Part 4的更多相关文章
- Java 7 可执行的 Nashorn,取代 Rhino
惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都能够使用.源代码在 https://bitbucket.org/ramonza/nashorn-backport ...
- Learning Java 8 Syntax (Java in a Nutshell 6th)
Java is using Unicode set Java is case sensitive Comments, C/C++ style abstract, const, final, int, ...
- Atitit。Js调用后台语言 java c# php swing android swt的方法大总结
Atitit.Js调用后台语言 java c# php swing android swt的方法大总结 1. Js调用后台语言有三种方法1 2. Swt BrowserFunction 绑定方法 ...
- JS代码检查工具ESLint
前面的话 ESLint是一个JavaScript代码静态检查工具,可以检查JavaScript的语法错误,提示潜在的bug,可以有效提高代码质量,维持前端团队高度一致的编码风格.ESLint不但提供一 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java 8 的 Nashorn 脚本引擎教程
本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...
- Nashorn 在JDK 8中融合Java与JavaScript之力
从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...
- Nashorn——在JDK 8中融合Java与JavaScript之力
从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript ...
- java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api
移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...
- Java 8 Nashorn JavaScript
转自:https://www.runoob.com/java/java8-nashorn-javascript.html Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Na ...
随机推荐
- WIN10 64位系统 如何安装.NET Framwork3.5
把SXS文件夹复制到C盘根目录,然后以管理员身份运行CMD,大概2分钟能完成,然后这个SXS文件夹就可以删了
- C#.NET常见问题(FAQ)-如何不显示窗口的关闭按钮
如果把ControlBox设置为false,则右上角三个按钮都看不到了 最好的方法是重写窗体的CreateParams方法,如下图所示 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间 ...
- Mycat读写分离、主从切换学习(转)
http://blog.csdn.net/zhanglei_16/article/details/50707487 Mycat读写分离.主从切换学习问题一:分表.分库的优缺点,以及分表无法成为主流分表 ...
- springboot升级到2.0后context-path配置不起作用
springboot升级到2.0后,context-path配置不起作用,改成了: server.servlet.context-path=/projname
- 基于FPGA的超声波测距(一)
硬件平台:CycloneII EP2C5Q208C8+DYP-ME007 1:超声波原理 DYP-ME007超声波测距模块可提供3cm--3.5m的非接触式距离感测功能,图1为DYP-ME007外观, ...
- [转] libtool的作用及应用
今天使用 autoconf 的时候遇到一个 libtool 的问题,觉得这个东西挺有意思,找了个文档过来,暂时记录. 转自:http://blog.csdn.net/larntin2002/artic ...
- Tensorflow设置显存自适应,显存比例
1. 按比例 config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.4 session = ...
- sql语句 case
case: SELECT stdname, max( CASE WHEN stdsubject = '语文' THEN result ELSE 0 END) "语文", max( ...
- 〖Linux〗干掉Kubuntu烦人的软件升级提示“Update notification daemon”,Your should update ..
Kubuntu是很好使用,但是升级提示也是太烦人了,开机的时候总是显示如下画面: 使用System Load Indicator(sudo apt-get install indicator-mult ...
- 查看MySQL的当前日期
select current_date(); 查看MySQL的当前日期