Groovy

Groovy基于Java语言,兼容Java语法,他其实就是一种较为系统的java语法糖,既可以作为面向对象编程语言,也可以作为脚本语言。

基础语法

Groovy Script 和 Groovy Object

作为脚本时,Groovy脚本文件中的所有脚本命令将会生成一个Java Class,并继承groovy.lang.Script类。

比如如下脚本 Hello.groovy

print("hello world")

将会生成一个与脚本文件名称相同的类,这里是Hello.class

import groovy.lang.Binding;
import groovy.lang.Script;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.callsite.CallSite;

// 继承Script,并提供一个 main 方法
public class Demo01 extends Script {
    public Demo01() {
        CallSite[] var1 = $getCallSiteArray();
        super();
    }

    public Demo01(Binding context) {
        CallSite[] var2 = $getCallSiteArray();
        super(context);
    }

    public static void main(String... args) {
        CallSite[] var1 = $getCallSiteArray();
        var1[0].callStatic(InvokerHelper.class, Demo01.class, args);
    }

    public Object run() {
        CallSite[] var1 = $getCallSiteArray();
        return var1[1].callCurrent(this, "hello world");
    }
}

不仅如此,在一个Groovy文件中可以混合类定义与脚本定义,但是脚本名不可以与脚本中定义的类名相同,因为脚本类也会生成Class,Class是不可以重名的。

如下代码是一个混合脚本,除了Hello.class,还会生成一个Person.class

使用def定义变量

Groovy提供关键字def用于定义变量,他是一种动态类型机制,也就是说,在运行时才会去校验数据类型;而静态类型是在编译时对数据类型进行校验检查。

分号可以用换行替换

类、成员默认全是public的

Java类、以及类中的成员,默认修饰级别为default,而Groovy中默认则是public的:

上面两个代码是相同的。

类中的属性会自动添加getter和setter

对象的属性操作

无论是哪儿种方式,实际上最终仍然是调用的getter和setter

创建对象使用构造器指定属性值

方法的定义

声明方法时,参数类型可省略:

方法的调用可以省略()

当不引起歧义的时候,方法调用的小括号可以省略,下面两行代码是相同的:

在Groovy中没有基本类型,字面量可以直接调用包装类型方法

三种字符串表示

  • 单引号:字符串常量,不具有运算能力,会被解析为 java.lang.String

  • 双引号:可引用变量${},具有运算能力,会被解析为 GStringImpl

  • 三引号:支持换行,会被解析为java.lang.String

自动类型转换

在需要的时候,类型之间会自动发生类型转换。

控制语句

控制语句基本与java相同。

闭包

定义:开放的、匿名的代码块,他可以接收参数,也可以有返回值。闭包还可以引用其周围作用域中声明的变量。

语法:

最后更新于

这有帮助吗?