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 ...
随机推荐
- C#.NET常见问题(FAQ)-构造器constructor有什么用
所谓的构造器constructor,就是声明类的时候定义一个public 类名的方法,这个方法不需要传递任何数据,这样的话在声明任何类的实例的时候都会无条件执行里面的方法 析构器只在程序销毁的时候 ...
- ArcGIS读取dem格式数据
DEM是GIS常用的一种数据,用来做各种分析.展示等,十分有用!它实质上就是一个栅格,只不过这个栅格值表示高程,常用的格式是tif,grid等.今天听到了另外一种说法:*.dem是最常见到的DEM的格 ...
- C#判断网站是否能访问或者宕机的方法
最近有位朋友说他有很多网址,可能有些已经过期或者不能访问了.自己去一个一个点可以,但又很麻烦! 再过一段时间又要去检查一次,每次都这样就不方便了! 于是就做了个小程序给帮他检测一下. 以下做了一个例子 ...
- Cocos2d-X中的声音和音效
在玩游戏时都会有各种游戏音,如启动游戏时会有背景音,胜利或者失败会有一些音效.在Cocos2d-X中能够使用CocosDenshion实现各种声音 在使用CocosDenshion之前须要在程序中加入 ...
- python2.7 安装pypcap出错 pcap.h not found
python安装pypcap的时候出错 通过不断百度+google找到解决方案 https://segmentfault.com/q/1010000007273835/a-10200000072756 ...
- 【leetcode】solution in java——Easy5
转载请注明原文地址: 21:Assign Cookies Assume you are an awesome parent and want to give your children some co ...
- VIM设置代码折叠
今天看了一下别人写的程序的源代码,发现是用vim写的,代码中有趣是用vim来折叠代码,一开始我以为是用插件的,后来上网查了查,得出以下使用方面的技巧. 1. 折叠方式 可用选项来设定折叠方式: 可在V ...
- 2、redis原生的命令操作不同数据类型
一.常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 String是最简单的类型,一个key对应一个v ...
- 输出数组第k大的元素
用快速排序的思想输出数组第k大的元素: #include<iostream> #include<algorithm> using namespace std; //递归实现:返 ...
- Jenkins配置自动化构建
转自: http://blog.sina.com.cn/s/articlelist_3053349671_14_1.html Jenkins 简介和安装(一) (2014-12-02 21:18:13 ...