Java 7 可執行檔 Nashorn,取代 Rhino

來源:互聯網
上載者:User

標籤:雜湊   hang   步驟   on()   factor   port   imp   ror   dump   

驚現有人把 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()}

除了將就還能怎麼辦涅?想想辦法唄(其實也就是Google一下)。

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

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

Java 7 可執行檔 Nashorn,取代 Rhino

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.