java7 rhino,Java 7 可运行的 Nashorn,代替 Rhino

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

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

编译源码

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

00219d32b724b31098b10224669ec44b.png  613b6d2e6632ca9d52ecc364797aa8e2.png

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

3c23c383c9bb1af40cb76a605287c3a9.png

然后“执行”即可编译 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值