Java执行动态脚本
Java执行一些动态的规则,使用动态字节码反而来说就太复杂了,所以Java提供了ScriptManager调用JavaScript、Groovy、Ruby以及Scheme和Haskell编写的脚本。
一、基于ScriptManager
简单记录下,ScriptManager执行JavaScript、Groovy的使用方法。
执行JavaScript
在新版JDK11中,Nashorn engine is planned to be removed from a future JDK release。
Nashorn是基于JavaScript的脚本引擎,但是由于JavaScript本身迭代太快,Nashorn难以维护,Java已经放弃。
不过虽然过时,但是不影响使用。毕竟JS那么多特性,作为一个Java的,谁会在意那么多。本质用法不变即可。
import org.junit.Test;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;public class TestScript {@Testpublic void testJs() throws Exception {String elValue = "0.9";String el = "(x<0.8478241755535717)&&(x>0.17470429385819297)";ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");engine.put("x", elValue);boolean eval = (boolean) engine.eval(el);//falseSystem.out.println(eval);}
}
执行Groovy
执行Groovy相对来说重量级一点。
引入依赖包
<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>3.0.10</version><type>pom</type>
</dependency>
执行groovy
import org.junit.Test;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;public class TestScript {/*** 导包* <dependency>* <groupId>org.codehaus.groovy</groupId>* <artifactId>groovy-all</artifactId>* <version>3.0.10</version>* <type>pom</type>* </dependency>*/@Testpublic void testGroovy() throws Exception {String elValue = "向晚";String el = "return '我最爱的虚拟人物:'+hobby;";ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("Groovy");engine.put("hobby", elValue);String eval = (String) engine.eval(el);//我最爱的虚拟人物:向晚System.out.println(eval);}
}
二、基于AviatorScript
导入依赖
<dependency><groupId>com.googlecode.aviator</groupId><artifactId>aviator</artifactId><version>5.3.0</version>
</dependency>
执行aviator
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import org.junit.Test;public class TestScript {/*** <dependency>* <groupId>com.googlecode.aviator</groupId>* <artifactId>aviator</artifactId>* <version>5.3.0</version>* </dependency>*/@Testpublic void testAviator() {String elValue = "向晚";String el = "return '我最爱的虚拟人物:'+hobby;";Expression compile = AviatorEvaluator.compile(el);String eval = (String) compile.execute(compile.newEnv("hobby", elValue));//我最爱的虚拟人物:向晚System.out.println(eval);}
}
三、对比
简单的动态规则,还是js比较轻量一点。其余两个都太重量级了。
参考致谢
killme2008/aviatorscript: A high performance scripting language hosted on the JVM.
java中执行JS脚本:ScriptEngineManager_赤子之心513的博客-CSDN博客_java scriptenginemanager
java中使用groovy脚本执行_不负春光不负己的博客-CSDN博客
Java中运行js代码_java小白-说的博客-CSDN博客_java 执行js
Java执行动态脚本相关推荐
- Java 执行 JS 脚本工具
Java 执行 JS 脚本工具 用途:为了便于系统扩展,提供了 JS 脚本的功能,可以通过在系统中执行脚本来获得更复杂的功能. 例如:系统提供了一个接口,这个接口不必非的有实现类,而是可以通过JS来实 ...
- java执行python脚本
python执行是由多种方式的,可以在java程序中编写python代码执行,也可以提前写脚本,通过执行脚本文件方式执行.由于个人需求,脚本内容动态变化,不适合写在代码中,故,介绍执行脚本的方式: 话 ...
- 脚本运行显示服务器超时,java执行shell脚本超时
java执行shell脚本超时 [2021-02-11 04:20:34] 简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...
- java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本
举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...
- java执行python脚本并传递参数_从Java执行Python脚本存在参数传递问题
我试图从Java执行一个python脚本.当我手动执行python脚本时,它正常工作.当我从Java执行它时,它的参数有问题:事实上,python的响应是"Usage"错误,就像我 ...
- java 执行js脚本_java中调用js脚本
JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...
- java执行python脚本_通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- java执行shell脚本 process.waitFor()返回1
记录一下今天遇到的一个问题 在java代码中执行shell脚本,部分代码如下 Process p = null; List<String> cmds = new ArrayList< ...
- mongodb java 执行js脚本_MongoDB编写并执行js脚本
使用mongodb项目时经常需要在数据库中插入假数据,如果每次都手动插入就会很麻烦,所以我们可以选择编写脚本来执行.mongodb是可以直接执行js脚本的,使用方法也比较简单. 编写脚本 以插入数据为 ...
最新文章
- python做一个考试系统_请用 Python 语言编写一个简易的系统登录程序。
- 06- 本地方法接口
- 题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树?...
- matlab怎么画二维热力图_[原创]Day3.箱线图和热力图的绘制
- pwm驱动电机 为什么pwm不能太快_认识直流电机的PWM驱动控制电路
- Android基础学习第二篇—Activity
- webpack打包优化之外部扩展externals的实际应用
- 【动态规划】P4170 :涂色(区间dp)
- 2014年国内最热门的.NET开源项目TOP25
- java 得到bean的属性_获取javaBean所有属性及类型.doc
- 算法59----打家劫舍【动态规划】
- ISO 20088耐低温泄漏的测定_ISO20088-1/ISO20088-2/ISO20088-3
- Javascript基础——函数
- idea 类注释模板
- 软考中级软件设计师易错点整理
- 四大网络抓包神器,总有一款适合你......
- comp3311辅导 assignment1
- Nginx配置https访问
- java 事物 notsupport_Spring事务传播属性介绍(二).mandatory、not_supported、never、supports...
- 《赢在中国》第三季观后感
热门文章
- RoboMaster机甲大师——视觉组——ubuntu开机自启动脚本分析
- PolarisMesh系列文章——灰度发布系列(蓝绿发布)
- C语言学习笔记06-占位符格式、C基本类型及逃逸字符一些细节(附介绍BCD码)
- Cortex-M3微处理器
- 基于JSP后台的电影院选座售票小程序 毕业设计毕设作品欣赏
- 2022年Java面试题基础系列228道(1),快看看哪些你还不会?
- 二叉树在线索化后,仍不能有效求解的问题是()
- Spring详细概述----->从入门到吃灰
- 博客帮助文档【翻译】
- “深度学习“汉字国标码GB2312