java8--新的JavaScript引擎Nashorn

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jasnet_u/article/details/83475082

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

猜你喜欢

转载自blog.csdn.net/jasnet_u/article/details/83475082