首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >JDK8系列之JavaScript引擎Nashorn

JDK8系列之JavaScript引擎Nashorn

作者头像
SmileNicky
发布2022-09-21 15:49:22
发布2022-09-21 15:49:22
1.8K0
举报
文章被收录于专栏:Nicky's blogNicky's blog

从JDK1.8开始,Java采用Nashorn作为嵌入式 JavaScript 引擎。JDK1.6和JDK1.7采用Rhino。Nashorn 支持 ECMAScript 5.1 规范,使用基于 JSR 292 的新语言特性,其中包含在 JDK 7 中引入的 invokedynamic,将 JavaScript 编译成 Java 字节码。

下面给出一些例子加深理解,一个最简单的例子,调用1+2,计算输出打印

代码语言:javascript
复制
package com.example.jdkexample.core.nashorn;


import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class NashornJavaScriptExample {


    public static void main(String[] args) throws ScriptException {
         ScriptEngineManager engineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
        String foo = "1+2";
        System.out.println(scriptEngine.eval(foo));
        
    }
}

可以利用ScriptEngine对js进行执行,然后通过Hutool转为javabean

代码语言:javascript
复制
private static void testJson() throws ScriptException {
        String script = "var json ={\"name\":\"admin\" , \"mobiTel\":\"123\"};" +
                "var result ={};result.name=json.name;result.mobiTel=json.mobiTel;JSON.stringify(result);";

        ScriptEngineManager engineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
        Object obj = scriptEngine.eval(script);
        User user = JSONUtil.toBean(obj.toString() , User.class);
        System.out.println(user.toString());
    }

读取js文件,然后执行js脚本

代码语言:javascript
复制
private static void testJsFile()  {
        try (Reader reader= new FileReader(new File(ScriptEngineExample.class.getClassLoader().getResource("test.js").getFile()))){
            ScriptEngineManager engineManager = new ScriptEngineManager();
            ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
            scriptEngine.eval(reader);
        } catch (FileNotFoundException e) {
            log.error("FileNotFoundException:{}" , e);
        } catch (IOException e) {
            log.error("IOException:{}" , e);
        } catch (ScriptException e){
            log.error("ScriptException:{}" , e);
        }
    }

给出一串js,invokeFunction调用js里的函数

代码语言:javascript
复制
private static void testInvokeFunction() throws ScriptException, NoSuchMethodException {
        String script = "var json ={\"name\":\"admin\" , \"mobiTel\":\"123\"};" +
                "function jsonStringify(){ var result ={};result.name=json.name;result.mobiTel=json.mobiTel;print(JSON.stringify(result));}";
        ScriptEngineManager engineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
        scriptEngine.eval(script);
        Invocable invocable = (Invocable) scriptEngine;
        invocable.invokeFunction("jsonStringify");
    }

使用Bindings 传参

代码语言:javascript
复制
private static void testBinding() throws ScriptException, NoSuchMethodException {
       ScriptEngineManager engineManager = new ScriptEngineManager();
       ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
       Bindings bindings = new SimpleBindings();
       bindings.put("username","admin");
       scriptEngine.eval("print('hello , ' + username);" , bindings);
   }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档