Groovy 是基于JVM虛擬機的一種動態(tài)語言萨咳,語法和Java非常相似垮刹。Groovy完全兼容Java,又在此基礎(chǔ)上增加很多動態(tài)類型和靈活的特性鸵隧,比如閉包绸罗,支持DSL,是一門非常靈活的動態(tài)腳本語言豆瘫。
每個Gradle的腳本文件都是一個Groovy腳本文件珊蟀,可以在里面寫任何符合Groovy語法代碼,比如自定義類外驱,聲明函數(shù)育灸,定義變量等。Groovy又完全兼容Java昵宇,這 意味著在build腳本文件里寫任何的Java代碼描扯,非常靈活方便。
字符串
' ' " " 都代表字符串趟薄,但是單引號沒有運算能力,而雙引號具有運算能力
task printStringClass {
def str1='單引號'
def str2="雙引號"
println "單引號定義的字符串類型:"+str1.getClass().name
println "雙引號定義的字符串類型:"+str2.getClass().name
def name="張三"
println '單引號變量計算${name}'
println "雙引號變量計算${name}"
}
集合
- List
task printList{
def numList=[1,2,3,4,5,6]
println numList.getClass().name
//訪問第二個元素
println numList[1]
//訪問最后一個元素
println numList[-1]
//訪問第二到第四個元素
println numList[1..3]
numList.each{
println it
}
}
- Map
task printMap{
def map=['width':1024,'height':768]
println map.getClass().name
println map['width']
println map.height
map.each{
println "key:${it.key} value:${it.value}"
}
}
方法
- 括號可以省略
task invokeMethod{
method1(1,2)
method1 2,3
}
def method1(int a,int b){
println a+b
}
- return 可以不寫
task printMethodPrint{
def add1=method2 1,2
def add2=method2 2,3
println "add1:${add1} add2:${add2}"
}
def method2(int a,int b){
if(a>b){
a
}else{
b
}
}
- 代碼塊可以作為參數(shù)傳遞
map.each({
println it
})
map.each(){
println it
}
map.each{
println it
}
- JavaBean
class Person{
private String name;
}
task hellJavaBean{
Person p=new Person()
println "name : ${p.name}"
p.name="zhangsan"
println "name: ${p.name}"
}
閉包
是Groovy的一個非常重要的特性典徊,可以說它是DSL基礎(chǔ)杭煎。閉包不是Groovy的首創(chuàng)恩够,但是它支持這一重要特性。
- 自定義閉包
task helloClosure{
customEach{
println it
}
}
def customEach(closure){
for(int i in 1..10){
closure(i)
}
}
- 向閉包傳遞參數(shù)
task helloClosure{
//多個參數(shù)
eachMap{
k,v -> println "k:$k v:$v"
}
}
def eachMap(closure){
def map=["name":"zhangsan","age":18]
map.each{
closure(it.key,it.value)
}
}
- 閉包委托
Groovy閉包有thisObject/owner/delegate 三個屬性羡铲,當你在閉包內(nèi)調(diào)用方式時蜂桶,由它們來確定使用哪個對象來處理。默認情況下delegate/owner是相等的也切,但是delegate是可以被修改的扑媚,這個功能非常強大,Gradle中閉包的很多功能都是通過修改delegate實現(xiàn)的雷恃。
task helloDelegate{
new Delegate().test{
println "thisObject:${thisObject.getClass()}"
println "owner:${owner.getClass()}"
println "delegate:${delegate.getClass()}"
method3()
it.method1()
}
}
def method3(){
println "Context this:${this.getClass()} in root"
println "method3 in root"
}
class Delegate{
def method1(){
println "Delegate this:${this.getClass()} in Delegate"
println "method1 in Delegate"
}
def test(Closure<Delegate> closure){
closure(this)
}
}
task configClosure{
personMethod{
personName="zs"
personAge=10
dumpPerson()
}
}
class PersonObj{
String personName
int personAge
def dumpPerson(){
println "name is ${personName} age is ${personAge}"
}
}
def personMethod(Closure<PersonObj> closure){
PersonObj p=new PersonObj()
closure.delegate=p
//委托模式優(yōu)先
closure.setResolveStrategy(Closure.DELEGATE_FIRST)
closure(p)
}
DSL
Domain Specific Language 領(lǐng)域特定語言疆股,是專門關(guān)注某一領(lǐng)域的語言,它在于專倒槐,而不是全旬痹。Gradle就是一門DSL,它是基于Groovy讨越,專門解決自動化構(gòu)建的DSL两残。