java7 rhino,Java 7 可运行的 Nashorn,代替 Rhino
驚現(xiàn)有人把 OpenJDK 上的 Nashorn dump 下來,使得 Java 7 都可以使用!源碼在 https://bitbucket.org/ramonza/nashorn-backport/。
原本 Nashorn 是 Java 8 才有的。現(xiàn)在有人作了向后兼容,好事!
編譯源碼
只有源碼沒有 jar,要自己編譯。沒關(guān)系很簡單:ant -f make/build.xml。具體步驟先把源碼拖進 Eclipse 項目,然后打開 Ant 視圖:
?
點擊 + 圖標添加 make/build.xml
然后“執(zhí)行”即可編譯 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
創(chuàng)建一個已經(jīng)封裝過的 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 對象轉(zhuǎn)換為 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());測試觀察發(fā)現(xiàn):
js 的 {} 哈希類型會自動轉(zhuǎn)為 jdk.nashorn.api.scripting.ScriptObjectMirror,而不是 Rhino 的 NativeObject,但兩者都可以轉(zhuǎn)為 Map
js 的 [] 數(shù)組類型會自動轉(zhuǎn)為 jdk.nashorn.api.scripting.ScriptObjectMirror,而不是 Rhino 的 NativeArray,但可以用 isArray() : boolean 判斷是否數(shù)組
js 的 Number 類型會自動轉(zhuǎn)為 java.lang.Integer,而不是 Rhino 的 Double,這樣在處理數(shù)字類型時比較方便。
不過這是早期版本,缺了正式版才有的功能,例如:
if(so.isArray()) {
int[] iarr = (int[])ScriptUtils.convert(so, int[].class); // 轉(zhuǎn)換為 java 數(shù)組保存,因為還沒有 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;
}
事實上,如果你不是強迫癥,數(shù)組 get(0)/get(1)/... 一樣可用,無須轉(zhuǎn)換一次。
單測代碼(很重要!)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
總結(jié)
以上是生活随笔為你收集整理的java7 rhino,Java 7 可运行的 Nashorn,代替 Rhino的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [视频降噪] GoPro FastDVD
- 下一篇: 移动web知识总结(超详细)附带思维导图