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

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值