Java 7 可执行的 Nashorn,取代 Rhino
惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都能够使用。源代码在 https://bitbucket.org/ramonza/nashorn-backport/。
原本 Nashorn 是 Java 8 才有的。如今有人作了向后兼容。好事!
编译源代码
仅仅有源代码没有 jar。要自己编译。没关系非常easy: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<String, Object> 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
Java 7 可执行的 Nashorn,取代 Rhino的更多相关文章
- Java 8新特性之 Nashorn(八恶人-6)
Joe Gage 盖奇·乔 “First time in my life I made a pretty penny.And, figured I'd come home and spend time ...
- Java使用Optional与Stream来取代if判空逻辑(JDK8以上)
Java使用Optional与Stream来取代if判空逻辑(JDK8以上) 通过本文你可以用非常简短的代码替代业务逻辑中的判null校验,并且很容易的在出现空指针的时候进行打日志或其他操作. 注:如 ...
- Java JDBC下执行SQL的不同方式、参数化预编译防御
相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...
- 怎么优化JAVA程序的执行效率和性能?
现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...
- Java SSH远程执行Shell脚本实现(转)
前言 此程序需要ganymed-ssh2-build210.jar包(下载地址:http://www.ganymed.ethz.ch/ssh2/) 为了调试方便,可以将\ganymed-ssh2-bu ...
- 捕获Java线程池执行任务抛出的异常
捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { publi ...
- JAVA 文件编译执行与虚拟机(JVM)简单介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...
- 浅析java程序的执行过程
在研究任何一门语言时,无论是面向过程的c,c++(面向过程和面向对象),还是面向对象的.net,java等,弄清语言执行过程至关重要. 何为语言执行过程? 所谓语言执行过程,指对于任何一门语言,如j ...
- 通过指令码来判断Java代码的执行顺序(++问题与return和finally的问题)
问题 在<深入理解Java虚拟机>一书中遇到了如下代码: public int method() { int i; try { i = 1; return i; } catch (Exce ...
随机推荐
- cocos2d-js 添加广告
http://www.cocoachina.com/bbs/read.php?tid=225655
- Unity相机平滑跟随
简介 unity中经常会用到固定视角的相机跟随,然后百度发现大家都是自己写的,然后偶也写咯一个,分享一下 PS: 由于刚学C#不久,才发现delegate这个东东,也不知道对性能影响大不大,但是看MS ...
- Android RecyclerView遇到notifyDataSetChanged无效时的解决方案
一.简述 不管AbsListView(ListView.GridView)或是新出的RecyclerView,在使用notifyDataSetChanged方法更新列表数据时,一定要保证数据为同个对象 ...
- Android studio & SDK的国内有效站点。
SDK.TOOLS的国内有效镜像节点: mirrors.zzu.edu.cn/android/repository/ 网上的地址只写了mirrors.zzu.edu.cn,有误,需要补齐后面的子目录才 ...
- Recyclerview点击事件,更新item的UI+更新Recyclerview外的控件
项目中用到了Recyclerview,在第一行代码中学到了一种相对来说简单的点击事件方法,可是这种点击事件是在adapter中写的,没有教怎么更新item的ui和更新Recyclerview之外的控件 ...
- 01--Java开发中文乱码问题分析
一.常见的编码格式 1. ASCII码 总共128个字符,用1个字节的低7位表示,0~31是控制字符,32~126是打印字符. 2. ISO-8859-1 ISO组织在ASCII基础上进行扩展,仍是 ...
- SQL基本操作——JOIN多表联查
基本概念 join :用于根据两个或多个表中的列之间的关系,从这些表中查询数据. join和key:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join.数据库中的表可 ...
- php用户注册常用检测、写入
// 判断数据库是否已经存在 $check_sql = "select * from user where idNumber='$idNumber'"; $check_query ...
- 顺序表查找及其优化(Java)
顺序表查找(线性查找): private static void Ordersearch(int[] arr,int num) { for (int i = 0; i < arr.length; ...
- DOS批处理命令-字符串操作
1.字符串替换 语法结构:%变量名:替换前=替换后% @set str=teh cat in teh hat @echo %str% @set str=%str:teh=the% @echo %str ...