JDK1.8中如何用ScriptEngine动态执行JS

jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机“这一目标。

ScriptEngine功能强大,基本能实现笔者所能想到的Java与JavaScript交互的需求。而且十分的方便简洁。jdk1.8又对ScriptEngine接口进行了一定改变,因此,在jdk1.8能运行的代码,在1.6中可能会报错,反之亦然。

下面通过具体的代码讲解:

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 JSEngine {
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();
}
}

  

JDK1.8中如何用ScriptEngine动态执行JS的更多相关文章

  1. Javascript动态执行JS(new Function与eval比较)

    new Function与eval可以动态执行JS,只要把拼接好的JS方法,然后以字符串的形式传入到这两个函数,可以执行,其中new Function用在模板引擎比较多. 用 Function 类直接 ...

  2. 在Loadrunner中如何用system函数执行系统命令

    前提: windows 系统 实现功能:用 LR 中的system函数执行系统命令 相关功能:在LR中利用C函数建立文件,写文件,读文件. 主要相关函数:sprintf/fopen/fgetc/fre ...

  3. sqlserver 存储过程中拼接sql语句 动态执行

    ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...

  4. C# 动态执行JS

    有时候需要,在程序中灵活的嵌入自定义的计算逻辑,使用C#加载JS脚本形式可以实现: // 添加引用 using Microsoft.JScript; string jsStr = "var ...

  5. Java8中执行js脚本

    代码中除了callJSFunctionFromFile函数,其他均转载于文章JDK1.8中如何用ScriptEngine动态执行JS import jdk.nashorn.api.scripting. ...

  6. SQL函数中的动态执行语句

    一.为什么要使用动态执行语句? 由于在PL/SQL 块或者存储过程中只支持DML语句及控制流语句,并不支持DDL语句,所以Oracle动态执行语句便应允而生了.关于DDL与DML的区别,请参见:DDL ...

  7. (转+整理)C#中动态执行代码

    通过微软提供的CSharpCodeProvider,CompilerParameters,CompilerResults等类,可以在运行时,动态执行自己写的代码文件.原理就是把你的代码文件动态编译成e ...

  8. winform WebBrowser控件中,cs后台代码执行动态生成的js

    很多文章都是好介绍C# 后台cs和js如何交互,cs调用js方法(js方法必须是页面上存在的,已经定义好的),js调用cs方法, 但如果想用cs里面执行动态生成的js代码,如何实现呢? 思路大致是这样 ...

  9. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

随机推荐

  1. 2019-03-28-day021-抽象类与接口类

    今日内容 type和class 继承 抽象类 接口类 多态 java 鸭子类型 pickle模块 collections.namedtuple type和class ##type ##class pr ...

  2. ORACLE中使用DBMS_RANDOM去产生随机数

    一.生成随机字符串:DBMS_RANDOM.STRING 用法:DBMS_RANDOM.STRING(选项, 返回字符串长度) 选项有如下几种可供选择:1)'u', 'U' - returning s ...

  3. Java中的13个原子操作类

    java.util.concurrent.atomic包一共提供了13个类.属于4种类型的原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新属性.Atomic包里的类基本都是使 ...

  4. Spring Boot 揭秘与实战(五) 服务器篇 - Tomcat 代码配置

    Spring Boot 内嵌的 Tomcat 服务器默认运行在 8080 端口.如果,我们需要修改Tomcat的端口,我们可以在 src/main/resources/application.prop ...

  5. Caution: request is not finished yet

    /********************************************************************** * Caution: request is not fi ...

  6. 【c++基础】遍历目录并写入txt文件-linux

    前言 /****************************************************************************** * File: get_train ...

  7. 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

    更改 sys.defaultencoding 为文件的编码方式  #! /usr/bin/env python  # -*- coding: utf-8 -*-  import sys  reload ...

  8. 如何用input标签上传多个图片并回显

    本文主要记录如何用input标签和jquery实现多图片的上传和回显,不会涉及后端的交互,大概的效果看图 我们从零来做一个这样的demo 第一步: 我们先完善一下我们的页面,默认的input-file ...

  9. lesson7cnn architecture-fastai

    课程https://v.qq.com/x/page/e0398lijt8h.html 讲解: http://www.sohu.com/a/144583206_697750 resnet可以看作VGG1 ...

  10. C++学习(九)(C语言部分)之 项目 推箱子游戏

    游戏制作 推箱子 步骤分析 1.模板 2.模板分析 组成元素: 空地 墙 人 目的地 箱子 背景 3.如何操作 通过WASD键盘操作人,推着箱子,到达目的地,游戏结束,如果箱子卡在死角则游戏失败 4. ...