Groovy与Java
Groovy是一种与Java非常相似的脚本语言,编译器会将该脚本语言编译成class字节码文件,最终运行于Java虚拟机之上。
环境配置
前提是配置好JDK
Groovy环境在类Unix上配置,只需以下的几行命令即可:
第一步下载sdkman,这是管理sdk的工具,命令如下:
curl -s get.sdkman.io | bash
读取并执行sdkman的初始化脚本,如下命令:
source "$HOME/.sdkman/bin/sdkman-init.sh"
接着安装groovy的sdk,命令如下:
sdk install groovy
最后,检验是否安装成功:
groovy -version
Groovy工具
安装完Groovy环境之后,输入groovy命令时,会有如下的工具:
groovyc:groovy编译器,类似于javac,将groovy脚本编译成class字节码文件
groovy:用于运行groovy脚本
groovyConsole:Groovy官方提供的一个简易IDE,如下图
groovysh:groovy命令交互式的shell,类似python中的交互式环境。
另外,很多出名的IDE均已支持Groovy,本人使用的是IntelliJ IDEA。
引用标识符
注意,Groovy的语法与Java十分相似,这里只重点介绍与Java有区别的语法,相同的就不再赘述。
引用标识符:Groovy中对变量的引用方式是多样化的,Test.groovy源码如下:
void testQuotedIdentifiers() { def map = [:] map.no_quote = 1 map.'single quote' = 2 map."double quote" = 3 map.'''triple single quote''' = 4 map."""triple double quote""" = 5 map./slashy string/ = 6 map.$/dollar slashy string/$ = 7 def closureQuote = "value" map."closure quote ${closureQuote}" = 8 println(map) } testQuotedIdentifiers()
运行结果如下:
[no_quote:1, single quote:2, double quote:3, triple single quote:4, triple double quote:5, slashy string:6, dollar slashy string:7, closure quote value:8]
上述代码先定义一个静态方法,然后在方法内定义了一个Map(本质上是java中的LinkedHashMap实例)。接着使用不同的引用操作符的方式往这个map中添加键值对,最后打印这个map实例,如下图:
紧接着来看Test.groovy编译之后的class代码:
public class Test extends Script { public Test() { CallSite[] var1 = $getCallSiteArray(); } public Test(Binding context) { CallSite[] var2 = $getCallSiteArray(); super(context); } public static void main(String... args) { CallSite[] var1 = $getCallSiteArray(); var1[0].call(InvokerHelper.class, Test.class, args); } public Object run() { CallSite[] var1 = $getCallSiteArray(); if (!__$stMC && !BytecodeInterface8.disabledStandardMetaClass()) { this.testQuotedIdentifiers(); return null; } else { return var1[1].callCurrent(this); } } public void testQuotedIdentifiers() { CallSite[] var1 = $getCallSiteArray(); Object map = ScriptBytecodeAdapter.createMap(new Object[0]); byte var3 = 1; ScriptBytecodeAdapter.setProperty(Integer.valueOf(var3), (Class)null, map, (String)"no_quote"); byte var4 = 2