Java 执行动态脚本
JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式。JSR 233是JavaSE6的一部分,在Java表中API中的包是javax.script。
下面根据实践来说一下调用动态语言脚本具体做什么:
假如有这种情况:需要判断一个变量a
的大小,但是判断规则
是不确定的,可能是 a < 1
,也可能是 a > 1
、a == 1
等等。
- 下面是不调用动态脚本实现:
public boolean compare(double a, String expression) { int n = Integer.parseInt(expression.replaceAll("\\D", "")); if(expression.contains(">=")) { return a >= n; } else if(expression.contains("<=")) { return a < n; } else if(expression.contains("==")) { return a == n; } else if(expression.contains(">")) { return a > n; } else { ... } }
实现起来比较麻烦,就是一堆判断。但是对于 a < 1 && a > 0
这种复杂的表达式实现起来更加吃力。
- 下面是调用js脚本实现:
public boolean compare(double a, String expression) throws Exception{ expression = expression.replace("a", a) ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine scriptEngine = sem.getEngineByName("js"); return scriptEngine.eval(expression); }
通过这种方式实现起来非常简单,而且可以应对复杂的表达式。
下面是执行js
脚本与lua
脚本的对比:
- 执行
js
脚本
测试代码
int size = 10000; ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine scriptEngine = sem.getEngineByName("js"); long start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { String jsStr = String.format("%d > %d", i, i+1); try{ scriptEngine.eval(jsStr); }catch (Exception e) { e.printStackTrace(); } } long end = System.currentTimeMillis(); System.out.printf("js:%d ms\n" ,end - start);
- 执行
lua
脚本
需要第三方库
Luaj
的支持
Luaj是基于lua 5.2.x版本的lua解释器,其中考虑了以下目标:
- 以Java为中心的lua vm实现,旨在利用标准Java功能。
- 轻量级,高性能的lua执行。
- 可以在JME,JSE或JEE环境中运行的多平台。
- 用于集成到实际项目中的完整库和工具集。
- 由于对vm和库功能进行了充分的单元测试,因此可靠。
测试代码
int size = 100000; Globals globals = JsePlatform.standardGlobals(); long start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { String luaStr = String.format("return %d > %d", i, i+1); LuaValue chunk = globals.load(luaStr); chunk.call().toboolean(); } long end = System.currentTimeMillis(); System.out.printf("lua:%d ms\n", end - start);
平均执行时长
lua
:900 msjavascript
:60000 ms
lua脚本的执行效率大大高于js脚本的执行效率。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一个两年Java程序员的面试总结
注:文章第一人称形式,不代表小编 前言 16年毕业到现在也近两年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去了网易。 但是要特别感谢点我达的领导及HR,真的非常非常好,很感谢他们一直的关照和指导。 面试整体事项 简历要准备好,联系方式一定要正确清晰醒目,项目经历按照时间倒序阐述,注意描述自己在项目中承担的职责,简历的模板尽量选择简洁的,毕竟程序员大部分还是喜欢简单明了的。 推荐boss直聘,我觉得很好用(不是广告)。 一般的整体面试流程都是电面->现场面->HR面->等着。 不要觉得HR说让你回去等消息就是GG了,他们也要跟你之前的面试官讨论,再向领导汇报,如果说不急可能还要和其他候选人比较,所以HR让你回去等消息绝对不是说明你完蛋了。 面试前准备好自我介绍,1分钟左右就可以,可以写在纸上,电面可以照着念,等你到了现场面了基本也都快背下来你的自我介绍了。 准备好扎实的基础,这是一切的根源,没实力怎么都没用的。 面试中你可以把你的面试官往你会的知识上引导(...
- 下一篇
Python高级知识点学习(一)
image.png Python中一切皆对象 和Java相比,Python的面向对象更加彻底。 函数和类也是对象,是python的一等公民。 代码和模块也可以称之为对象。 python中的类也是对象,类可以理解为模板,根据这个模板去生成我们的对象,可以动态修改类的属性。 何为一等公民? 可以赋值给一个变量 可以添加到集合对象中 可以作为参数传递给函数 可以当做函数的返回值 (生成器应用) type、object、class之间的关系 类是由type来生成的一个对象,object是所有类都要继承的最顶层的一个基础类,type也是一个类,同时也是一个对象。 看代码片段一: a = 1 b = "abc" print(type(1)) print(type(int)) print(type(b)) print(type(str)) 打印出的结果: <class 'int'> <class 'type'> <class 'str'> <class 'type'> 代码片段二: class Student: pass class MyStudent...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块