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 ...
随机推荐
- 是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?
错误提示 : 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入 是否缺少对 Microsoft.CSharp.dll 和 System.Core ...
- linux加入windows域
http://www.redhat.com/rhecm/rest-rhecm/jcr/repository/collaboration/jcr:system/jcr:versionStorage/36 ...
- 1067: 密室寻宝(find)
#include <iostream> #include <iomanip> #include <cstdlib> #include <string> ...
- 将Spring-boot应用部署到Docker容器
1:Docker中设置阿里云加速 使用阿里云的加速器,因为在使用docker的时候,会需要从docker的网站下载镜像文件,下载速度可能会很慢.获得阿里云加速,需要登录阿里云开发者平台,然后点击右侧的 ...
- 关于inode&硬连接
这两天看了一道面试题,什么是inode?我勒个去,第一次听说.于是Google了一下,发现下面这段内容讲解的非常不错,供大家参考. 一.inode是什么? 理解inode,要从文件储存说起.文件储存在 ...
- loadrunner -27778 https连接问题
Error -27778: SSL protocol error when attempting to read with host "×××.*****"
- 前端安全系列(一):如何防止XSS攻击?
原文:https://my.oschina.net/meituantech/blog/2218539 前端安全 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全 ...
- 【Zookeeper】源码分析之持久化(二)之FileSnap
一.前言 前篇博文已经分析了FileTxnLog的源码,现在接着分析持久化中的FileSnap,其主要提供了快照相应的接口. 二.SnapShot源码分析 SnapShot是FileTxnLog的父类 ...
- Android——复制项目出现Application Installation Failed
今天把一个项目复制到另一个文件夹下,重新打开结果不能正常安装到虚拟机上了. 解决方法: Build——Clean Project :清除一下项目缓存 Build——Rebuild Project ...
- ACE中对于不同类型数据的最大值最小值管理ACE_Numeric_Limits
对于不同类型的变量,这里定义了其最大最小值来提供给ACE_Utils等使用 template <typename T> struct ACE_Numeric_Limits; // ---- ...