从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));
};