一、前言
由于业务系统用到了 Groovy 语言,本次分享就当对groovy 语言做一个简单总结,主要内容参考于官方文档(Groovy 的官方文档还是非常不错的,强烈推荐阅读),希望对 Groovy 感兴趣的同学有所帮助,如有不对之处还望指出哈。
二、简介
Groovy 是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)。并且,Groovy 可以与 Java 语言无缝对接,在写 Groovy 的时候如果忘记了语法可以直接按Java的语法继续写,也可以在 Java 中调用 Groovy 脚本,都可以很好的工作,这有效的降低了 Java 开发者学习 Groovy 的成本。Groovy 也并不会替代 Java,而是相辅相成、互补的关系,具体使用哪门语言这取决于要解决的问题和使用的场景。
三、使用场景
规则引擎、流程引擎,可以做动态脚本环境,尤其是那些不需要发布又经常变更的场合。
四、groovy 编译原理

在后台,所有的groovy代码都运行在JVM中并且使用的是java对象模型,不管你写的是groovy类,或者是groovy脚本,它们都作为java类在JVM中运行。

在JVM中运行groovy类有两种方式:

  1. 使用groovyc编译所有的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类加载器来加载这些类。

  2. 通过groovy的类加载器在运行时直接加载*.groovy文件并且生成对象,在这种方式下,没有生成任何*.class,但是生成了一个java.lang.Class对象的实例,也就是说,当groovy代码中包括一个new MyClass()的表达式时,并且也有一个MyClass.groovy的文件,这个文件将被解释,一个MyClass的类型将被产生并且增加到类加载器中,在代码中将像从*.class一样获取到MyClass对象。
    也就是说,groovy源代码可以使用groovyc编译,然后通过java类加载器加载,也可以直接通过groovy类加载器直接加载

五、工程项目的创建
1.下载Groovy开发工具包(GDK)
http://www.groovy-lang.org/download.html
2.idea创建Groovy项目

六、与Java的一些区别
Groovy 语句无需使用分号(;)结尾,加上也可以,完全兼容 Java 的语法。Groovy 中==等价于 Java 中的equals方法。

注释
注释和 Java 一样,支持单行(//)、多行(/* /)和文档注释(/* */);

变量
1.Groovy 中定义变量默认访问修饰符是public,变量定义时遵循 Java 变量命名规范,除了这些规则之外,Groovy 定义变量时如果是一行定义一个类型,末尾的分号可以省略,但是如果多个变量占一行,变量之间必须以分号分割。

2.Groovy 定义变量的方式和 Java 是类似的,区别在于 Groovy 提供了def关键字供使用,它可以省略变量类型的定义,根据变量的值进行类型推导。

定义变量的字面量值为数字时,类型会根据数字的大小自动调整

对于浮点型字面量为了精度 Groovy 默认使用的类型为 BigDecimal

Groovy为 数字类型提供一种更简单的声明类型的方式:类型后缀

字符串
在Groovy种有两种字符串类型,普通字符串(java.lang.String)和插值字符串(groovy.lang.GString)。

普通字符串使用单引号

插值字符串使用双引号

双引号所包括起来的字符串字面量会被解释为 GString 值(即 “Groovy 字符串”的简称),所以如果当某个类中的 String 字面量含有美元字符($)时,那么利用 Groovy 和 Java 编译器进行编译时,Groovy 很可能就会编译失败,或者产生与 Java 编译所不同的结果。
在 Groovy 中,由单引号所创建的字面量属于 String 类型对象,而双引号创建的字面量则可能是 String 或 GString 对象,具体分类由字面量中是否有插值来决定。
字符
在 Groovy 中并没有明确的字符字面量表示形式,需要显示的指定,有三种方式

方法(函数)
Groovy 方法的默认访问修饰符是public,方法的返回类型可以不需要声明,但需添加def关键字。有返回值的方法return可以被省略,默认返回最后一行代码的运行结果,如果使用了return关键字则返回指定的返回值。

Groovy 方法的参数类型可以被省略,默认为Object类型。

Groovy 方法的其他特性与Java一样,比如支持重载、不定长参数(…)等。

闭包
Groovy 提供了闭包的支持,语法和 Lambda 表达式有些类似,简单来说就是一段可执行的代码块。闭包在 Groovy 中是groovy.lang.Closure类的实例,这使得闭包可以赋值给变量,或者作为参数传递。
闭包可以访问外部变量,而方法(函数)则不能。

闭包调用的方式有两种,闭包.call(参数)或者闭包(参数),在调用的时候可以省略圆括号。

闭包的参数是可选的,如果没有参数的话可以省略->操作符。

多个参数以逗号分隔,参数类型和方法一样可以显式声明也可省略。

闭包可以作为参数传入,闭包作为方法的唯一参数或最后一个参数时可省略括号。

Lists
Groovy 定义 List 的方式非常简洁,使用中括号[],以逗号 (,)分隔元素即可。Groovy中的 List 其实就是java.util.List,实现类默认使用的是java.util.ArrayList。

Arrays
Groovy 定义数组的语法和 List 非常类似,区别在于数组的定义必须指定类型为数组类型,可以直接定义类型或者使用def定义然后通过as关键字来指定其类型。

Maps
Groovy 定义 Map 的方式非常简洁,通过中括号包含key、val的形式,key和value以冒号分隔([key:value])。Groovy中的Map其实就是java.util.Map,实现类默认使用的是java.util.LinkedHashMap。


Range
在 Groovy 中可以使用…操作符来定义一个区间对象,简化范围操作的代码。

POJO
Groovy 默认会隐式的创建getter、setter方法,并且会提供带参的构造器,下面两者是等价的。

  1. Groovy 在项目中的使用
    项目整合Groovy

动态执行groovy代码有3种方式

GroovyShell:GroovyShell允许在Java类中(甚至Groovy类)求任意Groovy表达式的值。使用Binding对象输入参数给表达式,通过GroovyShell返回Groovy表达式的计算结果。

GroovyClassLoader:用 Groovy 的 GroovyClassLoader ,动态地加载一个脚本并执行它的行为。GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类。

项目中:

GroovyScriptEngine:GroovyShell多用于推求对立的脚本或表达式,如果换成相互关联的多个脚本,使用GroovyScriptEngine会更好些。GroovyScriptEngine从您指定的位置(文件系统,URL,数据库,等等)加载Groovy脚本,并且随着脚本变化而重新加载它们。如同GroovyShell一样,GroovyScriptEngine也允许您传入参数值,并能返回脚本的值。

!](https://img-blog.csdnimg.cn/d3feda3374e94978974bba3508399c3b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Iy06aaZ5omT5Y2k6JuL,size_20,color_FFFFFF,t_70,g_se,x_16)

8、使用中遇到的坑
如果是jdk1.7 ,Groovy每执行一次脚本,都会生成一个脚本对应的class对象,并new一个InnerLoader去加载这个对象,而InnerLoader和脚本对象都无法在gc的时候被回收运行一段时间后将perm占满,一直触发fullgc。

因为对于同一个groovy脚本,groovy执行引擎都会不同的命名,且命名与时间戳有关系。当传入text时,class对象的命名规则为:“script” + System.currentTimeMillis() + Math.abs(text.hashCode()) + “.groovy”。这就导致就算groovy脚本未发生任何变化,每次执行parse方法都会新生成一个脚本对应的class对象,且由GroovyClassLoader进行加载,不断增大perm区。

9.解决方式
对 GroovyClassLoader缓存进行清理

1.加载完清理缓存

2.定时缓存清理

groovy基本语法及在项目中使用相关推荐

  1. nuxt 脚手架创建nuxt项目中不支持es6语法的解决方案

    nuxt 脚手架创建nuxt项目中不支持es6语法的解决方案 参考文章: (1)nuxt 脚手架创建nuxt项目中不支持es6语法的解决方案 (2)https://www.cnblogs.com/jk ...

  2. 在VUE项目中使用SCSS,从安装步骤到语法说明,带你快速入门!!

    最近在做VUE项目时用到了SCSS ,在这里总结一下SCSS在项目中是如何使用的. 首先要了解什么是SCSS? SCSS是一种CSS预处理语言,定义了一种新的专门的编程语言,编译后形成正常的css文件 ...

  3. c语言 2059 语法错误,关于CUDA C 项目中“ error C2059: 语法错误:“” ”问题的解决方法...

    该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译. 发生该语法错误的原因是cu文件被C++编译器所编译, ...

  4. MySQL数据库(安装配置 语句语法使用 项目中操作MySQL)

    文章目录: 一:安装配置 1.安装MySQL 2.卸载MySQL 3.汉化MySQL 4.启动和停止MySQL 5.修改MySQL密码 6.连接MySQL 二:语句语法使用 1.语句使用:增删改查 增 ...

  5. C++57个入门知识点_50 菱形继承与虚继承(C++中语法允许多重继承造成菱形继承;会造成近亲结婚的问题;可以通过虚继承的方式解决;实际项目中不多用多重继承)

    上篇C++57个入门知识点_49 多重继承与组合(一个类同时具有多个类的属性的方法:多重继承或者组合:多重继承:一个类同时继承多个类:多重继承构造和析构的顺序与普通继承类似:组合:类中包含多个成员对象 ...

  6. 处理项目中的ESlint语法报错问题

    处理项目中的ESlint语法报错问题 1.在项目根目录下创建一个格式化文件时候的配置项.prettierrc文件 {"semi";false,"singleQuote&q ...

  7. 在html项目中使用webpack编译es6语法

    前言:在html项目中遇到了使用import导入npm安装的依赖包,结果就是在浏览器中报错.然后开始了各种的解决方式,最后通过webpack对代码进行编译打包,然后再引入到html页面,从而解决代码报 ...

  8. Gradle项目中gradle.build文件中的buildScript代码块

    感谢原作者的劳动 在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: buildScript {repositories {mavenCentral()} }repos ...

  9. Android之项目中如何用好构建神器Gradle?

    Gradle虽为构建神器,但感觉学习曲线比较陡峭.Gradle User Guide内容很多,但有点太多了,多的你看不完,Gradle Plugin User Guide一篇文章主要讲了Android ...

最新文章

  1. Java常见数据结构以及特点、使用场景
  2. vue 导航栏刷新页面定位:
  3. oracle常用的时间格式转换
  4. SAP Cloud for Customer(C4C)前台显示的数据是如何从后台读取的
  5. Java虚拟机专题对象内存定位
  6. python合并文件夹下的文件_Python实现合并同一个文件夹下所有PDF文件的方法示例...
  7. 【ACL2019】知识图谱的全方位总结
  8. 20155210 网络攻防技术 实验三 免杀原理与实践
  9. cssmatic gradient css generator,10 Best CSS Gradient Generators
  10. MySQL的事务特性
  11. Android 第三方轮播图控件ConvenientBanner:通用的广告栏控件
  12. SBUS转485增程方案,SBUS控制远程机器人方案
  13. java将多个文件转成压缩包下载
  14. thrift 技术分享待续
  15. oracle 查询本年12月,Oracle查询1-12月数据
  16. Cmpp发送wappush
  17. ISE中显示IP核的图形化界面
  18. 未来已来,看北京理工大学的智慧校园如何落地
  19. html c3效果,使用c3动画实现摇铃铛效果
  20. JVM 2eden survivor分配问题)

热门文章

  1. 计算机毕业设计JavaVue.js音乐播放器设计与实现(源码+系统+mysql数据库+lw文档)
  2. 创建一个动态空间存储未知大小的二维数组
  3. LM75AD温度传感器的应用(2)
  4. 基于java学生签到考勤系统
  5. 第五期送书来了,这次送的都是畅销书!
  6. 疯魔余承东:四年间打造令苹果、三星敬畏的华为手机
  7. 刷了 1000 多道算法题,一点小小的心得!
  8. iOS开发 学习计划图
  9. 手把手教你:基于TensorFlow的语音识别系统
  10. vscode编译Window c++程序缺少vc运行库解决方法