日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/29 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 視圖:

?

點擊 + 圖標添加 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。