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

import jdk.nashorn.api.scripting.ScriptObjectMirror;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;
import java.io.FileReader;
import java.util.Map;
import java.util.TreeMap; public class JSEngine {
public static ScriptEngine engine;
public static String str; public static void getValues() 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";
System.out.println(engine.get("msg"));
System.out.println(engine.get("number"));
//获取数组
ScriptObjectMirror array = (ScriptObjectMirror) engine.get("array");
System.out.println(array.getSlot(0)); ScriptObjectMirror json = (ScriptObjectMirror) engine.get("json");
System.out.println(json.get("name")); //json嵌套
ScriptObjectMirror subjson = (ScriptObjectMirror) json.get("subjson");
System.out.println(subjson.get("subname"));
} 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));
} //给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{
str = "function add (a, b) {return a+b; }";
//执行js脚本定义函数
engine.eval(str);
Invocable invocable = (Invocable) engine;
Object res = invocable.invokeFunction("add",new Object[]{2,3});
System.out.println(res); } //读取js文件,执行函数;易变业务使用脚本编写,这样即使修改脚本,也不需重新部署java程序
public static void callJSFunctionFromFile() throws Exception{
//执行js
while (true){
//模拟执行期间add.js被修改
Thread.sleep(5000);
engine.eval(new FileReader("e:\\add.js"));
Invocable invocable = (Invocable) engine;
Object res = invocable.invokeFunction("add",new Object[]{2,3});
System.out.println(res);
}
} public static void main(String[] args) throws Exception{
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
engine = scriptEngineManager.getEngineByName("javascript");
getValues();
getObject();
putValue();
callJSFunction();
callJSFunctionFromFile();
} }

Java8中执行js脚本的更多相关文章

  1. 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果

            今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...

  2. 自动化测试中执行JS脚本方法封装

    执行JS脚本方法封装: class JavaScript(Base): def execute_javascript(self, js): """执行 JavaScrip ...

  3. java中执行JS脚本

    package 测试包; import javax.script.*; public class SSSSSSSSS { public SSSSSSSSS() { // TODO Auto-gener ...

  4. 在.Net中执行js

    在.Net中执行js 利用Noesis.Javascript开源组件可以做到在.net中执行js脚本,同时js脚本也能调用C#函数.这个组件的获得方式:在NuGet中输入搜索"Noesis& ...

  5. AngularJs中,如何在render完成之后,执行Js脚本

    AngularJs是Google开源的前端JS框架.使用AngularJs, 我们能够容易地.健壮的开发出类似于Gmail一样的单页Web应用.AngularJs这个新兴的MVC前端框架,具有以下特点 ...

  6. A标签执行JS脚本

    A标签执行JS脚本 分类: Web2012-12-25 22:48 1368人阅读 评论(0) 收藏 举报 前言 A标签是html中常用的标签,它与button按钮是实现页面跳转的两种最常用的方式,经 ...

  7. java中执行js代码

    要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...

  8. WinForm中执行JS代码(多种方法)

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  9. Angular在render完成之后,执行Js脚本

    AngularJs中,如何在render完成之后,执行Js脚本 app.directive('onFinishRenderFilters', function ($timeout) { return ...

随机推荐

  1. tp5 统一返回json格式

    控制器调用 public function json(){ if (request()->isPost()) { return jsonData(1,'转换成功',数据(可不填)); } } 公 ...

  2. 图片恢复有新招,EasyRecovery预览模式助你快速恢复

    EasyRecovery作为一款数据恢复软件,因其便捷的操作.低廉的价格深受大家的喜爱.EasyRecovery具有"傻瓜式"操作,就算你是第一次接触这款软件,通过主页提示也能很快 ...

  3. 从维基百科等网站复制数据和公式到MathType里编辑

    在我们写论文的时候,经常会需要用一些实际案例以及数据,而这些数据和案例有很大一部分可以直接在网络上找到.但是有时候也会发现我们想要的内容和公式,从网页上复制粘贴后太模糊,不适合打印和投影.就需要我们将 ...

  4. js控制某个div在页面加载完成5秒后隐藏

    <div id="k">测试</div><script>setTimeout("document.getElementById('k' ...

  5. 技巧:如何区分dll程序集的编译目标平台(同样适用于查看程序集的其它依赖)

    我们在进行net core迁移过程中,有时候需要区分一个dll是针对netstandard平台还是net framework. 本文提供一个技巧来快速区分:通过工具dnSpy打开目标dll,按照如下截 ...

  6. C和指针课后练习题3

    1.在你的机器上,字符的范围有多大?有那些不同的整数类型以及他们的范围? C语言中数据输入输出格式: %d 有符号10进制整数%i 有符号10进制整数%o 无符号8进制整数%u 无符号10进制整数%x ...

  7. Python超全干货:【二叉树】基础知识大全

    概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree) 二叉树的链式存储: ...

  8. 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号

    [NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...

  9. Fiddler 4 (过滤器的使用)

    1.先找到过滤器并且勾选 2.勾选 并填写要过滤的地址 3.运行 最终效果如下

  10. 第7.10节 Python类中的实例变量定义与使用

    一.    引言 在前面章节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享 ...