Java8中执行js脚本
代码中除了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脚本的更多相关文章
- 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果
今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...
- 自动化测试中执行JS脚本方法封装
执行JS脚本方法封装: class JavaScript(Base): def execute_javascript(self, js): """执行 JavaScrip ...
- java中执行JS脚本
package 测试包; import javax.script.*; public class SSSSSSSSS { public SSSSSSSSS() { // TODO Auto-gener ...
- 在.Net中执行js
在.Net中执行js 利用Noesis.Javascript开源组件可以做到在.net中执行js脚本,同时js脚本也能调用C#函数.这个组件的获得方式:在NuGet中输入搜索"Noesis& ...
- AngularJs中,如何在render完成之后,执行Js脚本
AngularJs是Google开源的前端JS框架.使用AngularJs, 我们能够容易地.健壮的开发出类似于Gmail一样的单页Web应用.AngularJs这个新兴的MVC前端框架,具有以下特点 ...
- A标签执行JS脚本
A标签执行JS脚本 分类: Web2012-12-25 22:48 1368人阅读 评论(0) 收藏 举报 前言 A标签是html中常用的标签,它与button按钮是实现页面跳转的两种最常用的方式,经 ...
- java中执行js代码
要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...
- WinForm中执行JS代码(多种方法)
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- Angular在render完成之后,执行Js脚本
AngularJs中,如何在render完成之后,执行Js脚本 app.directive('onFinishRenderFilters', function ($timeout) { return ...
随机推荐
- 为什么TCP连接时是三次握手,而不是两次或四次?
TCP连接时有一个重要的任务就是服务端和客户端双方互相确认收发功能是否正常.图中步骤1,当客户端发起连接,服务端接收到请求,对于服务端来说,它此时知道客户端的发送功能和自己的接收功能是正常的. 图中步 ...
- Python:利用Entrez库筛选下载PubMed文献摘要
一个不是学生物的孩子来搞生物,当真是变成了一块废铁啊,但也是让我体会到了一把生物信息的力量. 废话不多说,开整! 任务:快速高效从PubMed上下载满足条件的文献PMID.标题(TI).摘要(AB). ...
- 深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?
SpringBoot异常处理 简介 日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用try ,catch的方式处理异常或者throw,throws的方式抛出异常不管.这种 ...
- guitar pro系列教程(二):Guitar Pro主界面之记谱功能的详细解析【下】
本章节我们接着上一章节继续讲解关于guitar pro主界面的记谱功能里的符号功能.有兴趣的朋友可以进来一起学习哦. 首先我们看下图,这是点击按钮便会弹出的一个窗口,进入这个窗口,我们会看到" ...
- phpstorm里面添加swoole代码提示
https://yq.aliyun.com/articles/44246 下载代码: git clone https://github.com/eaglewu/swoole-ide-helper.gi ...
- 【ACwing 100】InDec序列——差分
(题面来自AcWing) 给定一个长度为 n 的数列 a1,a2,-,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中的所有数都一样, ...
- Steps 组件的设计与实现
NutUI 组件源码揭秘 前言 本文的主题是 Steps 组件的设计与实现.Steps 组件是 Steps 步骤和 Timeline 组件结合的组件,在此之前他们是两个不同的组件,在 NutUI 最近 ...
- LeetCode 019 Remove Nth Node From End of List
题目描述:Remove Nth Node From End of List Given a linked list, remove the nth node from the end of list ...
- golang 自学系列(四)——debug for vscode
golang 自学系列(四)--(调试)VSCode For Debug 这里如何装 vscode 我就不说了 这里如何在 vscode 正常写代码我也不说了 在能正常用 vscode 写 go 语言 ...
- java47
1. 1.List集合根据角标获取元素 import java.util.ArrayList; import java.util.List; public class List集合 { @Suppre ...