Java ScriptEngineManager
ScriptEngineManager
1、ScriptEngineManager是JDK6提出的相关方法,这方式的主要目的就是用来对脚本语言的处理。这里只是简单介绍一下对我们常用的数学公式的应用。
2、ScriptEngineManager是在java的javax.script的包下,是Java原生提供的脚本语言处理方法。
3、这里一个简单的demo,供参考
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class ScriptEngineManagerTest {public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");try {System.out.println(engine.eval("a*2".replace("a","2")));System.out.println(engine.eval("a<2".replace("a","1")));} catch (ScriptException e) {e.printStackTrace();}}
}
执行后的输出结果是:
4
true
Boolean flag = null;
try {flag = (Boolean) engine.eval("9%3==0");System.out.println(flag);
}catch(ScriptException e){System.out.println("执行脚本错误: "+ e.getMessage());
}
输出也是true。
5、其他的使用也可以自行研究一下
CompiledScript、SimpleBindings、SimpleScriptContext
这几个都是相关的处理脚本语言的东西,可以自己根据需要研究一下。
java 调用 js
import java.io.File;import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleScriptContext;import org.junit.Test;public class JavaScriptFunction {private static String jsFilePAth="/Users/username/IdeaProjects/log4j2_demo/src/main/resources/test.js";@Testpublic void print() throws Exception{ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");engine.eval("print('hello word!!')");}@Testpublic void obj() throws Exception {ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");StringBuffer script = new StringBuffer();script.append("var obj = new Object();");script.append("obj.hello = function(name){print('hello, '+name);}");//执行这段script脚本engine.eval(script.toString());// javax.script.Invocable 是一个可选的接口// 检查你的script engine 接口是否已实现!// 注意:JavaScript engine实现了Invocable接口Invocable inv = (Invocable) engine;// 获取我们想调用那个方法所属的js对象Object obj = engine.get("obj");// 执行obj对象的名为hello的方法inv.invokeMethod(obj, "hello", "Script Method !!" );}@Testpublic void file() throws Exception{ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");engine.eval(new java.io.FileReader(new File(jsFilePAth)));Invocable inv = (Invocable) engine;Object obj = engine.get("obj");inv.invokeMethod(obj, "hello", "知道了" );}/*** 脚本变量* @throws Exception*/@Testpublic void scriptVar() throws Exception{ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");File file = new File(jsFilePAth);//将File对象f直接注入到js脚本中并可以作为全局变量使用engine.put("files", file);engine.eval("print(files.getPath());print(files.getName());");}/*** 使用Script实现java接口* @throws Exception*/public void runnableImpl() throws Exception{ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");// String里定义一段JavaScript代码脚本String script = "function run() { print('run called'); }";// 执行这个脚本engine.eval(script);// 从脚本引擎中获取Runnable接口对象(实例). 该接口方法由具有相匹配名称的脚本函数实现。Invocable inv = (Invocable) engine;// 在上面的脚本中,我们已经实现了Runnable接口的run()方法Runnable runnable = inv.getInterface(Runnable.class);// 启动一个线程运行上面的实现了runnable接口的script脚本Thread thread = new Thread(runnable);thread.start();}/*** 脚本引擎的多个scope* @throws Exception*/@Testpublic void multiScopes() throws Exception{ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("nashorn");// 打印全局变量 "x"engine.put("x", "hello word!!");engine.eval("print(x);");// 上面的代码会打印"hello word!!"// 现在,传入另一个不同的script contextScriptContext context = new SimpleScriptContext();//新的Script context绑定ScriptContext的ENGINE_SCOPEBindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);// 增加一个新变脸到新的范围 engineScope 中bindings.put("x", "word hello!!");// 执行同一个脚本 - 但这次传入一个不同的script contextengine.eval("print(x);", bindings);engine.eval("print(x);");}public static void main(String[] args) throws Exception {new JavaScriptFunction().runnableImpl();}
}
test.js文件
print("测试文件");
var obj = new Object();
obj.hello = function(name){print('hello, '+name);}
这里面的test方法和main方法,都是可以正常执行的。
java将Logger对象注入到js对象中,在js文件中就可以使用java中的Logger对象了
import org.apache.logging.log4j.LogManager;import java.io.FileNotFoundException;
import java.io.FileReader;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;/*** 运行脚本* @author Ruby**/
public class RunScript {private ScriptEngineManager manager = new ScriptEngineManager();private ScriptEngine engine;private String fileName;public RunScript(String fileName){engine = manager.getEngineByName("JavaScript");this.fileName = fileName;}/*** 设置变量* @param varName* @param obj*/public void setVar(String varName, Object obj){engine.put(varName, obj);}/*** 启动脚本* @throws FileNotFoundException* @throws ScriptException*/public void start() throws FileNotFoundException, ScriptException{engine.eval(new FileReader(fileName));}public static void main(String[] args) throws Exception {RunScript rs = new RunScript("/Users/username/IdeaProjects/log4j2_demo/src/main/resources/test.js");rs.setVar("Logger", LogManager.getLogger());rs.start();}
}
test2.js
logger.info("测试文件");
参考文章:
1、Java利用ScriptEngineManager对计算公式的支持
2、https://www.jianshu.com/p/ba33c52c5b43
Java ScriptEngineManager相关推荐
- Java脚本化编程实践整理 ScriptEngineManager万字详解
文章目录 认识 Java支持脚本语言的意义 Java对JavaScript的支持 Rhino/Nashorn概述 Nashorn的目的 实践操作 HelloWorld 执行脚本文件代码 脚本语言使用J ...
- java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用
在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...
- java 简单 语言_将简单的表达式语言放入java中
使用 JavaScript engine that is bundled with Java 1.6怎么样? 您可以看到如何传递所有参数: ScriptEngineManager manager = ...
- java如何调用js_java如何调用js方法
js方法如下:function add(a,b){ return a + b + number; } 调用方法如下:(免费学习视频教程分享:java视频教程)package com.cgnb.data ...
- java 执行javascript_说说如何在 Java 中执行 JavaScript 脚本
Java 是强类型的静态语言,即所有的代码在运行之前都必须先进行严格的类型检查并编译为 JVM 字节码.这样做虽然保证了安全与性能,但却牺牲了灵活性.而那些动态语言(JavaScript .Pytho ...
- jsr223 java_JSR223 Java使用脚本引擎动态修改业务逻辑
本文来自图灵社区 @fairjm 转截请注明出处 偶尔会有一些业务需求是需要在动态改变线上代码的行为.一般的做法是使用个配置文件,存在数据库或者redis等存储中,程序动态获取之后解析并根据配置进行相 ...
- java executor_Java 动态语言支持
JDK6.0之后提供了脚本引擎功能,让我们可以执行某些脚本语言,特别是javascript(javascript是一门解释性语言,动态性非常好),让JAVA的动态性得到更充分的体现,某些时候可以更加灵 ...
- java aio事件模型_IO模型之AIO代码及其实践详解
当打开通道失败时,会抛出一个IOException异常. 1.2 绑定地址和端口 通过调用AsynchronousServerSocketChannel.bind(SocketAddress)方法来绑 ...
- 改善java程序的建议
一:变量.常量命名规则 包名全小写,类名首字母全大写,常量全部大写并用下划线分割,变量采用驼峰命名法.小写字母"l"和大写字母"O"不要和数字混用,如何要用请用 ...
最新文章
- 《电子基础与维修工具核心教程》——2.6 节点分压原理
- XamarinAndroid组件教程RecylerView自定义适配器动画
- aspx后台调用前台jquery_Jquery Ajax调用aspx页面方法
- 怎么把cad做的图分享给别人_干货在线 | 这20个CAD技巧值得收藏!
- [BZOJ3751] [NOIP2014] 解方程 (数学)
- 数据结构与算法之母牛生牛
- 理解ROS Navigation Stack,看完这篇你就知道啦!
- neo4j call
- python 点云配准,python点云滤波 点云配准用python怎
- 关于自动化测试,你真的懂嘛?
- 【Dairy】2016.11.5
- 鱼C论坛_VIP二号光盘
- 多个Excel文件合并成一个文件
- 中国无线电频率分配表
- 巨蟒python全栈开发-第5天 字典集合
- VBA word 文件类型html,使用vba进行Word文档的数学格式设置
- 项目文档说明前端部分怎么写?写进readme.md文件里面。
- Is your Tecplot 360 EX liense valid?
- 三次握手 resend
- Java【冒泡排序】算法, 大白话式图文解析(附代码)
热门文章
- 使用Postman调试API遇到“400 Bad Request”问题
- 喜大普奔!GitHub App 终于支持中文了,可尝鲜下载体验!
- matlab画图常见问题,matlab常见问题集
- 三星android版本升级包下载,三星Galaxy S21系列系统更新 安卓安全补丁更新到4月1日...
- 2020年美容师(中级)报名考试及美容师(中级)考试总结
- [CodeM美团比赛] 优惠券
- 宠物店小程序开发线上预约
- MySQL运行机制-从入门到京东
- ⚡三十分钟⚡小白写了一个坦克大战无敌版(找素材又花了半个小时/尴尬)
- Android之基于小米天气的天气源库