JAVA调用js函数

Nashorn介绍:
是由Oracle用Java编程语言开发的JavaScript引擎。它基于Da Vinci Machine(JSR 292),并随Java 8一起发布。它的前身是 基于Mozilla Foundation发布的Rhino开源修改的发布在jdk6上的Rhino。通过它可以轻松的访问java的资源。

JDK11之前版本

package io.icefox;

import java.util.Map;
import java.util.TreeMap;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;

import jdk.nashorn.api.scripting.ScriptObjectMirror;

public class JSTest {
    public static ScriptEngine engine;
    private static String str;
    //该函数测试Java获取JS变量值的能力
    public static void getJsValue() throws Exception{
        str = "  var msg='hello';          "
                + "  var number = 123;         "
                + "  var array=['A','B','C'];  "
                + "  var json={                "
                + "      'name':'pd',          "
                + "      'subjson':{           "
                + "           'subname':'spd'  "
                + "           ,'id':123        "
                + "           }                "
                + "      };                    ";
        //执行语句
        engine.eval(str);
        str="msg+=' world';number+=5";
        //再次执行
        engine.eval(str);
        //获取js变量msg(String类型)
        System.out.println(engine.get("msg"));
        //获取js变量msg(int类型)
        System.out.println(engine.get("number"));
        //获取js变量array(数组)
        ScriptObjectMirror array=(ScriptObjectMirror) engine.get("array");
        //getSlot(int index)函数用于获取下标为index的值
        System.out.println(array.getSlot(0));
        //获取js变量json(json类型)
        ScriptObjectMirror json=(ScriptObjectMirror) engine.get("json");
        //get(String key)函数用于键key的值
        System.out.println(json.get("name"));
        //获取js变量subjson(嵌套json类型)
        ScriptObjectMirror subjson=(ScriptObjectMirror)json.get("subjson");
        System.out.println(subjson.get("subname"));
    }
    //该函数测试Java与js对象
    public static void getObject() throws Exception{
        str = "  var obj=new Object();     "
                + "  obj.info='hello world';   "
                + "  obj.getInfo=function(){   "
                + "        return this.info;   "
                + "  };                        ";
        engine.eval(str);
        //获取对象
        ScriptObjectMirror obj=(ScriptObjectMirror) engine.get("obj");
        //输出属性
        System.out.println(obj.get("info"));
        System.out.println(obj.get("getInfo"));
        str="obj.getInfo()";
        //执行方法
        System.out.println(engine.eval(str));
    }
    //java将变量导入js脚本
    public static void putValue() throws Exception{
        str="Math.pow(a,b)";
        Map<String, Object>input=new TreeMap<>();
        input.put("a",2);
        input.put("b",8);
        System.out.println(engine.eval(str,new SimpleBindings(input)));
    }
    //调用js函数
    public static void callJsFunction() throws Exception{
        engine.eval("function add (a, b) {return a+b; }");
        Invocable jsInvoke = (Invocable) engine;
        Object res = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
        System.out.println(res);
    }
    public static void main(String[] args) throws Exception {
        //获取js引擎实例
        ScriptEngineManager sem = new ScriptEngineManager();
        engine=sem.getEngineByName("javascript");
        getJsValue();
        getObject();
        putValue();
        callJsFunction();
    }
}

JDK11之后版本

package io.icefox;

import org.openjdk.nashorn.api.scripting.ScriptObjectMirror;

import java.util.Map;
import java.util.TreeMap;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;


public class JSTest {
    public static ScriptEngine engine;
    private static String str;
    //该函数测试Java获取JS变量值的能力
    public static void getJsValue() throws Exception{
        str = "  var msg='hello';          "
                + "  var number = 123;         "
                + "  var array=['A','B','C'];  "
                + "  var json={                "
                + "      'name':'pd',          "
                + "      'subjson':{           "
                + "           'subname':'spd'  "
                + "           ,'id':123        "
                + "           }                "
                + "      };                    ";
        //执行语句
        engine.eval(str);
        str="msg+=' world';number+=5";
        //再次执行
        engine.eval(str);
        //获取js变量msg(String类型)
        System.out.println(engine.get("msg"));
        //获取js变量msg(int类型)
        System.out.println(engine.get("number"));
        //获取js变量array(数组)
        ScriptObjectMirror array=(ScriptObjectMirror) engine.get("array");
        //getSlot(int index)函数用于获取下标为index的值
        System.out.println(array.getSlot(0));
        //获取js变量json(json类型)
        ScriptObjectMirror json=(ScriptObjectMirror) engine.get("json");
        //get(String key)函数用于键key的值
        System.out.println(json.get("name"));
        //获取js变量subjson(嵌套json类型)
        ScriptObjectMirror subjson=(ScriptObjectMirror)json.get("subjson");
        System.out.println(subjson.get("subname"));
    }
    //该函数测试Java与js对象
    public static void getObject() throws Exception{
        str = "  var obj=new Object();     "
                + "  obj.info='hello world';   "
                + "  obj.getInfo=function(){   "
                + "        return this.info;   "
                + "  };                        ";
        engine.eval(str);
        //获取对象
        ScriptObjectMirror obj=(ScriptObjectMirror) engine.get("obj");
        //输出属性
        System.out.println(obj.get("info"));
        System.out.println(obj.get("getInfo"));
        str="obj.getInfo()";
        //执行方法
        System.out.println(engine.eval(str));
    }
    //java将变量导入js脚本
    public static void putValue() throws Exception{
        str="Math.pow(a,b)";
        Map<String, Object>input=new TreeMap<>();
        input.put("a",2);
        input.put("b",8);
        System.out.println(engine.eval(str,new SimpleBindings(input)));
    }
    //调用js函数
    public static void callJsFunction() throws Exception{
        engine.eval("function add (a, b) {return a+b; }");
        Invocable jsInvoke = (Invocable) engine;
        Object res = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
        System.out.println(res);
    }
    public static void main(String[] args) throws Exception {
        //获取js引擎实例
        ScriptEngineManager sem = new ScriptEngineManager();
        engine=sem.getEngineByName("javascript");
        getJsValue();
        getObject();
        putValue();
        callJsFunction();
    }
}

JDK11之后移除了

jdk.nashorn.api.scripting.ScriptObjectMirror

 使用JDK15之后版本需要添加maven依赖

使用org.openjdk.nashorn.api.scripting.ScriptObjectMirror

  <dependency>
      <groupId>org.openjdk.nashorn</groupId>
      <artifactId>nashorn-core</artifactId>
      <version>15.3</version>
  </dependency>

相关资料:

https://stackoverflow.com/questions/65265629/how-to-use-nashorn-in-java-15-and-later

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值