Java Nashorn--Part 6
Nashorn 的 JavaScript 语言的扩展
正如我们所讨论的,Nashorn 是一个完全符合 ECMAScript 5.1 的实现。然而除此之外,Nashorn 还实现了很多 JavaScript 语言的语法扩展,开发人员使用起来更加方便和容易。这些扩展被 JavaScript 开发者所熟悉,并且相当多的人重复扩展的 JavaScript 的 Mozilla 的方言版本,让我们来看看几个最常见的有用的扩展。
Foreach 循环
标准的 JavaScript 并没有等同于 Java 语言中的 foreach 循环,但是
Nashorn 实现了 Mozilla 方言版本的 foreach 循环体:
var jsEngs = [ "Nashorn", "Rhino", "V8", "IonMonkey", "Nitro" ];
for each (js in jsEngs) {
print(js);
}
单一功能的表达式
Nashorn 还支持另一个小的语法强化,如果一个函数(命名的或匿名的)只包含一个表达式,那么括号和返回语句可以省略。在下面的例子中,cube() 和cube2() 是完全等效的,但 cube() 通常是不合法的
JavaScript 语法:
function cube(x) x*x*x;
function cube2(x) {
return x*x*x;
}
print(cube(3));
print(cube2(3));
支持多个 catch 子句
JavaScript 只支持简单的 try、catch 和 throw 的异常处理。
注意:
在 JavaScrip t中,所有的异常都是 unchecked 类型的异常。
标准的 JavaScrip t只允许一个 catch 子句,不支持处理不同类型异常的 catch 子句。幸运的是,已经有一个现有的 Mozilla 的语法扩展提供这个功能,Nashorn 具有很好的支持,如下所示:
function fnThatMightThrow() {
if (Math.random() < 0.5) {
throw new TypeError();
} else {
throw new Error();
}
}
try {
fnThatMightThrow();
} catch (e if e instanceof TypeError) {
print("Caught TypeError");
} catch (e) {
print("Caught some other error");
}
具体实现细节
我们以前讨论过,Nashorn 直接编译 JavaScript 程序生成 JVM 字节码,然后就像其他类一样运行它们。例如,lambda 表达式可以作为
JavaScript 函数简单明了的表现,以及它们之间的简单的操作性。
让我们看下以前的例子,来看一下是如何用函数作为 Java 接口的匿名实现的。
jjs> var clz = Java.type("java.util.concurrent.Callable");
jjs> var obj = new clz(function () { print("Foo"); } );
jjs> print(obj);
jdk.nashorn.javaadapters.java.util.concurrent.Callable@290dbf45
这意味着实现 Callable 接口的具体实现的 JavaScript 对象的类型为jdk.nashorn.javaadapters.java.util.concurrent.Callable,这个类并不是 Nashorn 附带的,反而,Nashorn 实现不管什么样的接口,动态转换成字节码,只要求维护原始的名字作为包结构的一部分,看起来更加具有可读性。
注意:
动态代码生成是 Nashorn 必备的部分,Nashorn 编译所有所有的JavaScript 代码生成 Java 字节码,但从来不会解释代码。
由于 Nashorn 是完全遵从 ECMAScript 文档规范,所以有些时候实现的能力就会有所受限,像下面的例子,考虑打印出的对象是什么:
jjs> var obj = {foo:"bar",cat:2};
jjs> print(obj);
[object Object]
ECMAScript 说明要求输出的结果为 [object Object],而不允许提供更多有用的细节(例如,obj 里所有元素的属性和值)。
Java Nashorn--Part 6的更多相关文章
- 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)-命名空间namespace如何理解
Namespace就是定义一个对象是哪个门派的,比如你现在就在A门派下,A门派的所有功夫(属性和方法)都可以不加声明直接调用.如果你要用B门派的功夫,就要先声明是B门派的XXX对象的XXX实例的XXX ...
- ArcGIS10.3新体验
自2012年ESRI更新10.2以后,终于在2014年12月8日,官方推出了10.3版本,前几天忙于抢票,今天终于可以在虚拟机中体验一把. 由于使用的是预览版,所有安装包只有800多M,包括桌面核心程 ...
- RPi Desktop盒子安装与服务配置
批量安装配置盒子时候,可以先安装一个,其余的从这台copy过去. 之前的部分shell记录在本地,记录如下,以免忘记.下次可直接cp执行即可: Step1, 创建用户/组 sudo groupadd ...
- 带你走进EJB--将EJB发布为Webservice(3)
在上面文章中我们讲到,通过使用用JBoss5作为EJB容器的时候,调用Web服务出现了异常. 异常信息如下: *********************** CreateWeb Service Cli ...
- Linux内核配置:Makefile目标
在顶层Linux源码目录中输入命令make help,它会显示一长串从源码树中生成的目标列表.最常见的使用make的方式是不指定目标,在这种情况下,它会生成内核ELF文件vmlinux和针对所选架构的 ...
- unable to find the sources of your current Linux kernel.
运行 sh ./VBoxLinuxAdditions.run 时FAILED,查看日志: /tmp/vbox.0/Makefile.include.header:97: *** Error: unab ...
- golang之tcp自动重连
操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连. 测试服务器示例代码: /* ...
- maximum-subarray 序列最大连续和 贪心
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- cmake常用编译选项
1.openmp加载,cmake3.9之后内置了openmp find_package(OpenMP) if (OPENMP_FOUND OR OpenMP_CXX_FOUND) set (CMAKE ...
- DDIA
https://vonng.gitbooks.io/ddia-cn/content/ch7.html