代码中除了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. 利用代理IP池(proxy pool)搭建免费ip代理和api

    先看这里!!!---->转载:Python爬虫代理IP池(proxy pool) WIIN10安装中遇到的问题: 一.先安装Microsoft Visual C++ Compiler for P ...

  2. 神秘、常用、多变的Binder

    今天说说神秘又常用又多变的Binder~ Binder是什么 Binder通信过程和原理 在Android中的应用 Binder优势 Binder是什么 先借用神书<Android开发艺术探索& ...

  3. H5时代leaflet中还在用DivIcon?

    前段时间写了篇<leaflet如何加载10万数据>的文章,有同学反应其中的Canvas-Markers插件不支持DivIcon.我们今天就来聊一聊,为什么这个插件不支持DivIcon,以及 ...

  4. 用MindManager画思维导图的好处有哪些?

    大家都听说过思维导图吧?有没有将这样一种图形思维工具真正运用到我们的日常生活中去呢?是否真的知道思维导图怎么用呢?今天小编就来给大家讲一讲,思维导图怎么用. 老规矩,先给大家讲一讲小编用的软件跟系统, ...

  5. H5系列之canvas

    what is canvas?(什么是canvas) 其实他只是H5里面的一个标签而已,那么他作为一个标签,肯定有他的用途,他就像是一幅画布,等待着你来作画.可以说,他只是一个容器而已,需要配合着Ja ...

  6. 【性能测试】【locust】场景性能测试步骤

    场景设计 实现登陆基本功能,输出相应结果,脚本通 多用户实现随机登陆 添加初始化方法on_start: 每个用户只运行一次 添加检查点: catch_responses = True 脚本设计 # 导 ...

  7. Jmeter(二十九) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy2(详解教程)

    1.简介 上一篇文中已经对Badboy做了一个基本上详细完整的介绍,这一篇宏哥带你们实战一下,这一篇主要讲解和分享:录制和运行脚本.参数化 首先让我们使用N模式录制一个脚本,测试用例编号为:1.1.1 ...

  8. Codeforces Round #668 C. Balanced Bitstring (Div. 2)题解(思维)

    题目链接 题目大意 给你一个长为n的01串,要你使得每一个01串中0和1的个数都要相等,01串中有?字符,你可以使得这个字符变为0或1,要你求是否可以满足条件.输出YES或NO 题目思路 这个题目的难 ...

  9. go特性-defer

    1:后定义的defer先执行(可以理解为栈的方式) // 222 // 111 func Test1(t *testing.T) { defer fmt.Println("111" ...

  10. C#(三)基础篇—方法,递归,条件分支,循环,三元操作符

    C# 本随笔为个人复习巩固知识用,多从书上总结与理解得来,如有错误麻烦指正 2020-12-03 1.方法 static void Main(string[] args) { float Sum(fl ...