Groovy&Gradle
Groovy是基于JVM的一种脚本语言。
Gradle是新一代的自动化构建工具(似Ant+Ivy,Maven),其核心功能由Java实现。
并包含由Groovy编写的自动化构建领域特定语言(DSL)。
Gradle的构建脚本(build.gradle)就是一个可执行的Groovy脚本。
Groovy的语法特性
Groovy底层由Java实现,几乎100%地支持Java语法
还融合了Python等脚本语言的特性,可以更加简洁:
基本语法
- 省略分号:语句后的分号(;)是可选的。
- 省略括号:如果方法调用有参数传递,括号是可选的,如:
println 'Hello World'
。apply plugin:'java'
等价于apply([plugin:'java'])
; - 省略
return
:返回语句return
是可选的,默认返回方法体最后一条语句的值或null
,如无需返回应声明为void
。 类
、构造器
、成员方法
默认都是public
的。- 自动生成getter/setter,可以通过点号(.)操作成员,底层自动调用。
==
在底层自动调用equals
。assert
语句会一直生效,无需指定-ea
或-enableassertion
更多特性
-
类型弱化:
def
占位java.lang.Object
,运行时自动分析 且 引用的类型可变。 -
命名参数:默认构造 + setter赋值
class Person{ String name Integer age } def Person p = new Person(name:'Name1',age:18); assert p.age == 18
-
闭包
闭包是一个java.lang.Closure
类型的代码块
,可以赋值给变量,也可以作为方法调用。隐式闭包
没有显式定义参数的闭包都可以访问一个it
,代表调用这个闭包传过来的第一个参数,没传为null
。def increment={ assert it == 12 } increment(12)
显式闭包
def sum = { one, two, three -> one + two + three } println sum(1, 3, "14") // !!!: 414
返回值
闭包总是会返回值(return
返回、最后一条语句的值,或null
)。闭包作为方法参数
void echo(Closure<Object> closure, def obj){ println closure()+obj } echo({10},1)
闭包委托
闭包代码在委托上执行,默认委托是闭包的所有者,如:groovy.lang.Script
。闭包的隐式成员delegate
允许改变默认的所有者。class Person{ String name Integer age void update(Closure closure){ closure.resolveStrategy = Closure.DELEGATE_ONLY closure.delegate = this closure() } } Person person = new Person(name:"aCk",age:18); person.update { name = name.toUpperCase() age++ } println person.name+' : '+person.age // ACK : 19
-
字符串
三种定义方式:def s1 = 'Hello'; def s2 = "World"; def s3 = """ Hello, Groovy; """
其中双引号的串中可以有插值计算操作:
def s1 = 'groovy'; def s2 = "Hello ${s1.capitalize()}" assert s2=="Hello Groovy"
-
List与Map
// java.util.ArrayList def list = ['S1','S2']; list << 'S3' // list.add("S3"); assert list[2]=='S3' // list.get(2); list.each { /* it -> */ // 默认提供迭代器it println it } // java.lang.LinkedHashMap def map = ['K1':'V1', 'K2':'V2'] assert map.K1 == 'V1' assert map['K2'] == 'V2' assert map.size() == 2 map['K3'] = 'V3' map.each { key,val -> println "key $key's value is $val" }
-
GDK(Groovy Development Kit)
GDK拓展了JDK,并提供了很多更便捷的方法。具体可参见:http://groovy.codehaus.org/groovy-jdk/
new File().eachLine{ line ->
println line
}
Gradle中的Groovy
每个build.gradle
构建脚本都至少有一个对应的org.gradle.api.Project
实例,多数情况下脚本的属性和方法都委托给了这个实例。
// project.apply([plugin:''])
apply plugin: 'com.android.application'
// project.android({})
android {
// closure.delegate|owner.compileSdkVersion(28)
compileSdkVersion 28
defaultConfig {
applicationId "com.chavin"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
// closure.delegate|owner.setEnabled(true)
enabled = true
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}