java8--新的JavaScript引擎Nashorn
阿新 • • 發佈:2018-11-19
從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));
};