1. 程式人生 > >java8--新的JavaScript引擎Nashorn

java8--新的JavaScript引擎Nashorn

從JDK8開始,Nashorn引擎開始取代Rhino (jdk6、7中)成為java的嵌入式js引擎,它將js程式碼編譯為java位元組碼,與先前的Rhino的實現相比,效能提升了2到10倍。

 

jjs是java8中一個新的命令列工具,jjs能夠在控制檯執行java中js指令碼程式碼。

例如,編寫一個sample.js 內容如下
print("hello world")

儲存檔案,然後在當前目錄開啟控制檯視窗,執行
jjs sample.js 
即可在看到結果 ——在控制檯輸出了 hello world 字串。

jjs命令的互動模式:
在控制檯直接執行 jjs 回車即可進入互動模式,如再輸入

10+5 回車

控制檯輸出: 15

輸入quit() 可退出。

 

示例程式碼1 :java中使用js執行引擎

package com.tingcream.java8.nashorn;
 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
  
public class NashornEngineTest {
  public static void main(String[] args) throws ScriptException {
     
     // ScriptEngine engine= new ScriptEngineManager().getEngineByName("JavaScript");
      //引擎名稱傳入JavaScript、js、javascript、nashorn、Nashorn 均可等價
    //最好指定具體的引擎名稱為nashorn。若指定為JavaScript 也是採用JDK8中預設js引擎nashorn
    //  ScriptEngine engine= new ScriptEngineManager().getEngineByName("nashorn");
      ScriptEngine engine= new ScriptEngineManager().getEngineByName("Nashorn");
       
      // jjs a.js 
      // jjs a.js -- aa bb cc
      // jjs  [回車進入交換命令模式]
      /* Integer  result = (Integer) engine.eval("10+3");
       System.out.println(result);*/
      
       
      String  js="var a=10;var b=20; var c=a+b;c;";
        Double  o=  (Double) engine.eval(js);
        System.out.println(o);
       
       
   }
     
     
}

示例程式碼2: java程式碼中呼叫js指令碼檔案中的函式

package com.tingcream.java8.nashorn;
 
import java.io.File;
import java.io.FileReader;
 
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
 
import org.junit.Test;
 
  
public class NashornEngineTest2 {
    
    /**
     * java中呼叫js指令碼檔案中的函式
     * @throws Exception
     */
    @Test
    public void test1() throws  Exception {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        String path =this.getClass().getResource("script.js").getPath();//獲取檔案路徑
        engine.eval(new FileReader(new File(path)));//執行檔案
        Invocable invocable = (Invocable) engine;
        Object result = invocable.invokeFunction("func1", "張三");//呼叫js中函式
        System.out.println("返回結果: "+result);
         
    }
}

在當前目錄有一個script.js檔案,內容如下:

function func1(name) {
    print('Hi there from Javascript, ' + name);
    return "hello "+name;
};
 
var func2 = function (object) {
    print("JS Class Definition: " + Object.prototype.toString.call(object));
};