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相关推荐

  1. Java脚本化编程实践整理 ScriptEngineManager万字详解

    文章目录 认识 Java支持脚本语言的意义 Java对JavaScript的支持 Rhino/Nashorn概述 Nashorn的目的 实践操作 HelloWorld 执行脚本文件代码 脚本语言使用J ...

  2. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

  3. java 简单 语言_将简单的表达式语言放入java中

    使用 JavaScript engine that is bundled with Java 1.6怎么样? 您可以看到如何传递所有参数: ScriptEngineManager manager = ...

  4. java如何调用js_java如何调用js方法

    js方法如下:function add(a,b){ return a + b + number; } 调用方法如下:(免费学习视频教程分享:java视频教程)package com.cgnb.data ...

  5. java 执行javascript_说说如何在 Java 中执行 JavaScript 脚本

    Java 是强类型的静态语言,即所有的代码在运行之前都必须先进行严格的类型检查并编译为 JVM 字节码.这样做虽然保证了安全与性能,但却牺牲了灵活性.而那些动态语言(JavaScript .Pytho ...

  6. jsr223 java_JSR223 Java使用脚本引擎动态修改业务逻辑

    本文来自图灵社区 @fairjm 转截请注明出处 偶尔会有一些业务需求是需要在动态改变线上代码的行为.一般的做法是使用个配置文件,存在数据库或者redis等存储中,程序动态获取之后解析并根据配置进行相 ...

  7. java executor_Java 动态语言支持

    JDK6.0之后提供了脚本引擎功能,让我们可以执行某些脚本语言,特别是javascript(javascript是一门解释性语言,动态性非常好),让JAVA的动态性得到更充分的体现,某些时候可以更加灵 ...

  8. java aio事件模型_IO模型之AIO代码及其实践详解

    当打开通道失败时,会抛出一个IOException异常. 1.2 绑定地址和端口 通过调用AsynchronousServerSocketChannel.bind(SocketAddress)方法来绑 ...

  9. 改善java程序的建议

    一:变量.常量命名规则 包名全小写,类名首字母全大写,常量全部大写并用下划线分割,变量采用驼峰命名法.小写字母"l"和大写字母"O"不要和数字混用,如何要用请用 ...

最新文章

  1. 《电子基础与维修工具核心教程》——2.6 节点分压原理
  2. XamarinAndroid组件教程RecylerView自定义适配器动画
  3. aspx后台调用前台jquery_Jquery Ajax调用aspx页面方法
  4. 怎么把cad做的图分享给别人_干货在线 | 这20个CAD技巧值得收藏!
  5. [BZOJ3751] [NOIP2014] 解方程 (数学)
  6. 数据结构与算法之母牛生牛
  7. 理解ROS Navigation Stack,看完这篇你就知道啦!
  8. neo4j call
  9. python 点云配准,python点云滤波 点云配准用python怎
  10. 关于自动化测试,你真的懂嘛?
  11. 【Dairy】2016.11.5
  12. 鱼C论坛_VIP二号光盘
  13. 多个Excel文件合并成一个文件
  14. 中国无线电频率分配表
  15. 巨蟒python全栈开发-第5天 字典集合
  16. VBA word 文件类型html,使用vba进行Word文档的数学格式设置
  17. 项目文档说明前端部分怎么写?写进readme.md文件里面。
  18. Is your Tecplot 360 EX liense valid?
  19. 三次握手 resend
  20. Java【冒泡排序】算法, 大白话式图文解析(附代码)

热门文章

  1. 使用Postman调试API遇到“400 Bad Request”问题
  2. 喜大普奔!GitHub App 终于支持中文了,可尝鲜下载体验!
  3. matlab画图常见问题,matlab常见问题集
  4. 三星android版本升级包下载,三星Galaxy S21系列系统更新 安卓安全补丁更新到4月1日...
  5. 2020年美容师(中级)报名考试及美容师(中级)考试总结
  6. [CodeM美团比赛] 优惠券
  7. 宠物店小程序开发线上预约
  8. MySQL运行机制-从入门到京东
  9. ⚡三十分钟⚡小白写了一个坦克大战无敌版(找素材又花了半个小时/尴尬)
  10. Android之基于小米天气的天气源库