惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都可以使用!源码在 https://bitbucket.org/ramonza/nashorn-backport/。

原本 Nashorn 是 Java 8 才有的。现在有人作了向后兼容,好事!

编译源码

只有源码没有 jar,要自己编译。没关系很简单:ant -f make/build.xml。具体步骤先把源码拖进 Eclipse 项目,然后打开 Ant 视图:

 

点击 + 图标添加 make/build.xml

然后“执行”即可编译 jar 包,完成后保存在 dist 目录下。如果大家不能成功编译,给大家一个直接下载地址:http://download.csdn.net/detail/zhangxin09/9398572

测试

测试是否可用:

import javax.script.*;

public class NashornTest {

public static void main(String args[]) {

ScriptEngineManager manager = new ScriptEngineManager();

for (ScriptEngineFactory f : manager.getEngineFactories()) {

printBasicInfo(f);

System.out.println();

}

ScriptEngine nashorn = manager.getEngineByName("nashorn");

if(nashorn != null) {

System.out.println("Nashorn is present.");

}

else {

System.out.println("Nashorn is not present.");

}

}

public static void printBasicInfo(ScriptEngineFactory factory) {

System.out.println("engine name=" + factory.getEngineName());

System.out.println("engine version=" + factory.getEngineVersion());

System.out.println("language name=" + factory.getLanguageName());

System.out.println("extensions=" + factory.getExtensions());

System.out.println("language version=" + factory.getLanguageVersion());

System.out.println("names=" + factory.getNames());

System.out.println("mime types=" + factory.getMimeTypes());

}

}

检测是否可用的另外一个方法:try{final Class> cls = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror");} ..

比较 Rhino

创建一个已经封装过的 JS VM

Nashorn n = new Nashorn();

Object s = n.eval("g={a:1};");

Map ss = (Map)s;

ss.get("a");

System.out.println(ss.get("a").getClass().getName());

System.out.println(s.getClass().getName());

我封装的 api 自己感觉比较顺手,例如:

Map s = n.eval("g={a:1};", Map.class); // js 对象转换为 java map

Nashorn n = new Nashorn();

Object obj = n.eval("g=[1, 2, 3];");

System.out.println(obj.getClass().getName());

ScriptObjectMirror so = (ScriptObjectMirror)obj;

System.out.println(so.get(0).getClass().getName());测试观察发现:

js 的 {} 哈希类型会自动转为 jdk.nashorn.api.scripting.ScriptObjectMirror,而不是 Rhino 的 NativeObject,但两者都可以转为 Map

js 的 [] 数组类型会自动转为 jdk.nashorn.api.scripting.ScriptObjectMirror,而不是 Rhino 的 NativeArray,但可以用 isArray() : boolean 判断是否数组

js 的 Number 类型会自动转为 java.lang.Integer,而不是 Rhino 的 Double,这样在处理数字类型时比较方便。

不过这是早期版本,缺了正式版才有的功能,例如:

if(so.isArray()) {

int[] iarr = (int[])ScriptUtils.convert(so, int[].class); // 转换为 java 数组保存,因为还没有 convert()

}

除了将就还能怎么办涅?想想办法呗(其实也就是谷歌一下)。

public static void main(String[] args) throws ScriptException, IOException {

Nashorn n = new Nashorn();

n.load("C:/project/spring-test/src/com/ajaxjs/framework/config.js");

Object obj = n.eval("g=[1, 2, 3];");

System.out.println(obj.getClass().getName());

ScriptObjectMirror so = (ScriptObjectMirror) obj;

System.out.println(so.get(0).getClass().getName());

if (so.isArray()) {

System.out.println(so);

//int[] iarr = (int[]) ScriptUtils.convert(so, int[].class);

}

}

/**

* js arr2 java arr

* @param scriptObjectMirror

* @return

*/

public static Object[] toArray(ScriptObjectMirror scriptObjectMirror) {

if (!scriptObjectMirror.isArray()) {

throw new IllegalArgumentException("ScriptObjectMirror is no array");

}

if (scriptObjectMirror.isEmpty()) {

return new Object[0];

}

Object[] array = new Object[scriptObjectMirror.size()];

int i = 0;

for (Map.Entry entry : scriptObjectMirror.entrySet()) {

Object result = entry.getValue();

if (result instanceof ScriptObjectMirror && scriptObjectMirror.isArray()) {

array[i] = toArray((ScriptObjectMirror) result);

} else {

array[i] = result;

}

i++;

}

return array;

}

事实上,如果你不是强迫症,数组 get(0)/get(1)/... 一样可用,无须转换一次。

单测代码(很重要!)http://code.taobao.org/p/bigfoot_v2/src/java_v3/test/javascript/TestJS.java

Nashorn 文档:http://cr.openjdk.java.net/~sundar/jdk.nashorn.api/8u20/javadoc/jdk/nashorn/api/scripting/AbstractJSObject.html

java7 rhino,Java 7 可运行的 Nashorn,代替 Rhino相关推荐

  1. java犀牛是什么意思_深入浅出Rhino:Java与JS互操作

    2011年10月6日,一年一度的JavaOne大会隆重举行.JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition).标准版(SE ...

  2. rhino java api demo_javascript与java的相互调用,纯java的javascript引擎rhino(转载)

    1.下载Rhino安装包,下载地址:官网http://www.mozilla.org/rhino. 2.rhino环境配置,把解压出来的js.jar文件加入到系统的环境变量classpath 3.在命 ...

  3. java入门---Java 8 新特性之Nashorn JavaScript引擎

        Nashorn 一个 javascript 引擎.从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎.Nashor ...

  4. java类的运行顺序_Java语言类的基本运行顺序

    本文主要向大家介绍了Java语言类的基本运行顺序,通过具体的代码向大家展示,希望对大家学习Java语言有所帮助.我们以下面的类来说明一个基本的 Java 类的运行顺序:1. public class  ...

  5. Java程序后台运行,即使关掉Putty终端

    Java程序后台运行,即使关掉Putty终端 比如,通过Putty启动远程主机上面的文件 java -cp Crawler.jar Main& 关闭Putty终端之后,这个java程序也会被中 ...

  6. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

    内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...

  7. Java程序的运行原理及JVM的启动是多线程的吗?

    Java程序的运行原理及JVM的启动是多线程的吗? A:Java程序的运行原理 Java通过java命令会启动java虚拟机.启动JVM,等于启动了一个应用程序,也就是启动了一个进程. 该进程会自动启 ...

  8. Java JIT在运行JDK代码时是否作弊?

    本文翻译自:Does Java JIT cheat when running JDK code? I was benchmarking some code, and I could not get i ...

  9. 如何分析java程序_如何利用 JConsole观察分析Java程序的运行,进行排错调优

    一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JCons ...

最新文章

  1. 深入了解db file parallel read等待事件
  2. JXJJOI2018_T2_tank
  3. ffmpeg结构体(二)
  4. 【Java类加载机制】深入类加载器(二)自定义加密、解密类加载器
  5. JavaScript复制数组
  6. 略读《大教堂与市集》
  7. Python中利用parse_args与namespace来简化函数传参
  8. linux内核代码container_of
  9. 2016/1/15代码
  10. c语言 对排两个答案文件
  11. call stack是什么错误_17.2 错误处理
  12. 大学生心理健康管理系统
  13. 【51/STM32】详解控制系统中的继电器
  14. 嵌入式笔试题目及解析
  15. 基于J2EE的弹幕视频网站设计
  16. 高保真扬声器系统的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. HTML5 混合APP开发学习笔记(三)——CSS样式设计
  18. Zabbix企业微信告警最新版
  19. 数据库 - 字段属性
  20. Stand-Alone Self-Attention in Vision Models阅读笔记

热门文章

  1. excel怎么启用宏_如何用Excel制作一个高逼格的项目管理模板
  2. linux提交abaqus作业,命令行提交 Abaqus 任务
  3. 如何理解FFT中时间窗与RBW的关系
  4. 分布式架构 --- 分布式锁
  5. ionic -- 仿微信通讯录
  6. 记录一下HALCON基于可变形,利用CAD画dxf模板进行模板匹配(一)
  7. 【问题已解决】Caused by: java.lang.IllegalStateException
  8. strtok函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用)
  9. Haar-Feature分类器和卷积神经网络
  10. linux启动、关闭 consul