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'])
}