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执行动态脚本相关推荐

  1. Java 执行 JS 脚本工具

    Java 执行 JS 脚本工具 用途:为了便于系统扩展,提供了 JS 脚本的功能,可以通过在系统中执行脚本来获得更复杂的功能. 例如:系统提供了一个接口,这个接口不必非的有实现类,而是可以通过JS来实 ...

  2. java执行python脚本

    python执行是由多种方式的,可以在java程序中编写python代码执行,也可以提前写脚本,通过执行脚本文件方式执行.由于个人需求,脚本内容动态变化,不适合写在代码中,故,介绍执行脚本的方式: 话 ...

  3. 脚本运行显示服务器超时,java执行shell脚本超时

    java执行shell脚本超时 [2021-02-11 04:20:34]  简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...

  4. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  5. java执行python脚本并传递参数_从Java执行Python脚本存在参数传递问题

    我试图从Java执行一个python脚本.当我手动执行python脚本时,它正常工作.当我从Java执行它时,它的参数有问题:事实上,python的响应是"Usage"错误,就像我 ...

  6. java 执行js脚本_java中调用js脚本

    JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...

  7. java执行python脚本_通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  8. java执行shell脚本 process.waitFor()返回1

    记录一下今天遇到的一个问题 在java代码中执行shell脚本,部分代码如下 Process p = null; List<String> cmds = new ArrayList< ...

  9. mongodb java 执行js脚本_MongoDB编写并执行js脚本

    使用mongodb项目时经常需要在数据库中插入假数据,如果每次都手动插入就会很麻烦,所以我们可以选择编写脚本来执行.mongodb是可以直接执行js脚本的,使用方法也比较简单. 编写脚本 以插入数据为 ...

最新文章

  1. python做一个考试系统_请用 Python 语言编写一个简易的系统登录程序。
  2. 06- 本地方法接口
  3. 题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树?...
  4. matlab怎么画二维热力图_[原创]Day3.箱线图和热力图的绘制
  5. pwm驱动电机 为什么pwm不能太快_认识直流电机的PWM驱动控制电路
  6. Android基础学习第二篇—Activity
  7. webpack打包优化之外部扩展externals的实际应用
  8. 【动态规划】P4170 :涂色(区间dp)
  9. 2014年国内最热门的.NET开源项目TOP25
  10. java 得到bean的属性_获取javaBean所有属性及类型.doc
  11. 算法59----打家劫舍【动态规划】
  12. ISO 20088耐低温泄漏的测定_ISO20088-1/ISO20088-2/ISO20088-3
  13. Javascript基础——函数
  14. idea 类注释模板
  15. 软考中级软件设计师易错点整理
  16. 四大网络抓包神器,总有一款适合你......
  17. comp3311辅导 assignment1
  18. Nginx配置https访问
  19. java 事物 notsupport_Spring事务传播属性介绍(二).mandatory、not_supported、never、supports...
  20. 《赢在中国》第三季观后感

热门文章

  1. RoboMaster机甲大师——视觉组——ubuntu开机自启动脚本分析
  2. PolarisMesh系列文章——灰度发布系列(蓝绿发布)
  3. C语言学习笔记06-占位符格式、C基本类型及逃逸字符一些细节(附介绍BCD码)
  4. Cortex-M3微处理器
  5. 基于JSP后台的电影院选座售票小程序 毕业设计毕设作品欣赏
  6. 2022年Java面试题基础系列228道(1),快看看哪些你还不会?
  7. 二叉树在线索化后,仍不能有效求解的问题是()
  8. Spring详细概述----->从入门到吃灰
  9. 博客帮助文档【翻译】
  10. “深度学习“汉字国标码GB2312