用Groovy构建java脚本
我是做工作流项目的,工作流中各个模板引擎都需要要执行一个动态业务,这些动态业务有多种实现方式,最常用的就是用户自己写一段脚本文件,然后工作流引擎执行到这里的时候,运行这个脚本文件。
这个运行脚本文件的功能最初项目组是用ScriptEngineManager实现的。要求用户提供一个实现业务的jar,并写js脚本,脚本里动态地调用java内置在js引擎里的几个函数,这几个函数就是动态地调用jar里面的业务函数。
但是这样做太不方便,一是js无法调用java代码,只能预置java函数,或者通过预置的java函数反射其他业务函数。同时js语法对于java程序员也太晦涩了,作为java程序员,很多对js语法不够了解,甚至是误解的。
于是js这个方式我们就弃用了,现在准备使用Groovy这门语言来做脚本。
Groovy相信java开发人员都听说过,毕竟是java的兄弟语言,他和java一样都是基于jvm这个中间件的语言,关系可以类比c#.net和vb.net。和Groovy相同的基于jvm的语言也有很多,这里就不展开了。
那么使用Groovy有什么好处呢?
1.首先需求是要求使用动态脚本语言,调用java写的类库,因此语言最好是动态的,这样可以写得更少的代码,对于脚本也有来说代码长度至关重要。Groovy就是这样一个动态语言,有闭包以及其他动态语言中的特性。这些特性我不是特别看重,主要是他的集合对象调用非常简单,[]可以视为list对象,{}可以视为map对象,同时是弱类型的,你不需要像使用java一样在类型转换上花很多时间。这些对于脚本语言来说太重要了。毕竟脚本语言只是组织和调用java写的业务,自己不做业务,所以不需要太好的可维护性,但是需要足够灵活能够简单高效地调用业务函数。
2.Groovy几乎支持java的所有语法,你可以把他直接当做java来用,这样对于java工程师而言无疑是福音,如果你拒绝使用Groovy的动态特性,你完全可以只写java代码,完全把他当java来用。
3.Groovy能直接调用java现有的类,也就是说你可以直接使用某个jar提供的类库,这一点对于我们来说太重要了,直接new业务函数类,就可以调用jar里面的业务接口了。
为了测试Groovy是否能完成以上需求,我做了一个测试demo。
首先定义一个java类,充当业务jar。
public class JavaFunction {
public static int i = 0;
public String run() {
return "运行了java代码";
}
}
然后直接GroovyShell测试脚本
import groovy.lang.Binding;
import groovy.lang.GroovyShell; public class GroovyScriptEngineTest {
public static void main(String[] args) throws Exception {
Binding binding = new Binding();
binding.setVariable("javaFunction", new JavaFunction());
GroovyShell gs = new GroovyShell(binding);
Object value = gs.evaluate(
//可以引入java类
"import com.zrsoft.groovyScriptEngineTest.JavaFunction;"
+ "println 'Groovy可以直接import当前classpath里的类!';"
//可以写Groovy语法的代码。Groovy是动态语言,比java适合写脚本
+ "println '运行了Groovy代码!';"
//可以使用java风格的Groovy,其实就是java代码,因为Groovy支持java
+ "String javaCode = \"运行了Java风格的Groovy代码!\";"
+ "System.out.println(javaCode);"
//可以直接创建java自定义的对象
+ "JavaFunction newJavaFunction = new JavaFunction();"
+ "println \"在Groovy引擎里创建java对象,并\" + newJavaFunction.run();"
//可以调用脚本预设的java对象
+ "return javaFunction.run();");
System.out.println("为GroovyShell预设java对象,并在Groovy里" + value + ",同时证明Groovy可以返回变量给java。");
}
}
以上测试全部通过
Groovy可以直接import当前classpath里的类!
运行了Groovy代码!
运行了Java风格的Groovy代码!
在Groovy引擎里创建java对象,并运行了java代码
为GroovyShell预设java对象,并在Groovy里运行了java代码,同时证明Groovy可以返回变量给java。
当然以上测试完成,还不足以让我们确定使用Groovy做脚本方案可行,运行性能和运行后内存释放情况还需进一步考察。
用Groovy构建java脚本的更多相关文章
- 使用Groovy构建自己的脚本环境
场景 在进行Web服务端开发的时候,发布前通常需要测试一遍.对于一个大一点的项目,最好的办法是写个自动化测试程序. 以Groovy为例,写测试代码之前通常的有如下几个操作 引用相关的类库 import ...
- 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境
面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...
- atitit groovy 总结java 提升效率
atitit groovy 总结java 提升效率 #---环境配置 1 #------安装麻烦的 2 三.创建groovy项目 2 3. 添加 Groovy 类 2 4. 编译运行groovy类 ...
- Gradle构建Java Web应用(转)
转自:http://www.blogjava.net/jiangshachina/archive/2014/02/03/409285.html 本文是发布在java.net上的一篇摘自于<Gra ...
- Groovy与Java集成常见的坑(转)
groovy特性 Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似.它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能 ...
- 使用Eclipse+Maven+Jetty构建Java Web开发环境(几个教程综合集成2014发行)
工作需要使用Jetty由于web集装箱,得知Eclipse+Maven+Jetty该组合是非常好的,因此,要在网上找了很多教程,但不写或多或少特定的或过时的内容而导致最终的配置失败,易于配置为未来的同 ...
- Gradle学习之构建java与web项目
一.使用Gradle的java插件构建Java项目 1)Gradle插件包含了若干个接口定义和已有的任务项,语法结构:apply plugin:'插件名' ,此处我们定义插件 apply plugin ...
- 使用 Gradle 构建 Java 项目
使用 Gradle 构建 Java 项目 这个手册将通过一个简单的 Java 项目向大家介绍如何使用 Gradle 构建 Java 项目. 我们将要做什么? 我们将在这篇文档航中创建一个简单的 Jav ...
- Groovy和Java互调
Scala和Java为静态语言,Groovy为动态语言 Scala: 函数式编程,同时支持面向对象 Groovy: jvm上的脚本,较好兼容java语法,Groovy加强了Java集成. 可配置化的优 ...
随机推荐
- SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600
http://blog.csdn.net/feng19821209/article/details/8571571 SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10. ...
- PHP的日期和时间处理函数
1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...
- Hadoop学习笔记—3.Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- 谁能在同一文件序列化多个对象并随机读写(反序列化)?BinaryFormatter、SoapFormatter、XmlSerializer还是BinaryReader
谁能在同一文件序列化多个对象并随机读写(反序列化)?BinaryFormatter.SoapFormatter.XmlSerializer还是BinaryReader 随机反序列化器 +BIT祝威+悄 ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- TODO:小程序的用户身份
TODO:小程序的用户身份 小程序的用户身份有三种,一个管理员,二十个开发者,四十个体验者 1.管理员,可设置风险操作保护.风险操作提醒等操作. a)修改管理员,需要用到原管理员,新管理员的身份证号码 ...
- Vue 入门指南
英文:http://vuejs.org/guide/index.html 介绍 vue.js 是用来构建web应用接口的一个库 技术上,Vue.js 重点集中在MVVM模式的ViewModel层,它连 ...
- ASP.NET列表信息以Excel形式导出
1.从数据查出数据扔进table中: private DataTable getTable() { var dbHelper = applyBLL.CreateDataBase("VISAd ...
- Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义
Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义 首先我们指明,任何一种行动以及教派修行方法都有他的多元化,只看到某一方面,就不能很好的评估利弊,适不适合自己使 ...
- 解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程 昨天开发人员跟我说,执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅 ...