Gradle和Groovy介紹
Gradle
- Gradle是一款基于Apache的Ant和Maven概念的項(xiàng)目自動(dòng)化開源構(gòu)建工具
- Gradle的核心是基于Java來實(shí)現(xiàn)的贪婉,可以把Gradle看成就是一個(gè)輕量級(jí)的Java應(yīng)用程序
- Gradle使用Groovy反粥、kotlin等語言編寫自定義腳本,取代了Apache的Ant和Maven使用xml的方式
Groovy
- Groovy是一種基于JVM的敏捷開發(fā)語言
- Groovy代碼能夠很好的與Java結(jié)合疲迂,也能擴(kuò)展現(xiàn)有的代碼
Groovy才顿、Java和kotlin三者區(qū)別
- Groovy、Java及Kotlin都是基于JVM的開發(fā)語言
- Groovy基于Java尤蒿,在語法上基本相似郑气,但也做了很多自己的擴(kuò)展
- Goovy 和 Kotlin都有自己支持的DSL,兩者有許多共通之處
- Groovy和Java語法非常相似优质,可以無縫銜接使用Java
項(xiàng)目構(gòu)建
image.png
- 1竣贪、通過aapt打包res資源文件,比如AndroidManifest.xml巩螃、xml布局文件等演怎,并將這些xml文件編譯成二進(jìn)制,其中assets和raw文件夾的文件不會(huì)被編譯成二進(jìn)制避乏,最終會(huì)生成R.java和resources.arsc文件爷耀。
- 2、aidl工具會(huì)將aidl接口轉(zhuǎn)換成對(duì)應(yīng)的java接口
- 3拍皮、所有的java代碼歹叮,包括R.java和Java接口都會(huì)被java編譯成dex文件
- 4跑杭、Dex工具會(huì)將上一步生成得.class文件、第三方庫和其他.class文件編譯生成.dex文件
- 5咆耿、上一步編譯生成的dex文件德谅、編譯過的資源、無需編譯的資源(如圖片等)會(huì)被ApkBuilder工具打包程APK文件
- 6萨螺、使用Debug keystore或者Release Keystore對(duì)上一步的apk進(jìn)行簽名
- 7窄做、如果對(duì)apk正式簽名,還需要zipalign工具對(duì)apk進(jìn)行對(duì)齊操作慰技,這樣應(yīng)用運(yùn)行的時(shí)候會(huì)減少內(nèi)存的開銷
基本語法
Hello Groovy
- 關(guān)于idea創(chuàng)建第一個(gè)groovy椭盏,大家可以 參考這篇文章:https://blog.csdn.net/qq_29860591/article/details/105853214
class Test{
static void main(String[] args) {
println("Hello Groovy")
}
}
語法
- 基本數(shù)據(jù)類型
- byte、short吻商、int掏颊、long、float艾帐、double乌叶、char、boolean
- 包裝類(裝箱拆箱)
- String掩蛤、Byte枉昏、Short、Integer揍鸟、Long兄裂、Float、Double阳藻、Char晰奖、Boolean
- 自動(dòng)裝箱:因?yàn)镚roovy具有動(dòng)態(tài)類型特性,所以它從一開始就支持自動(dòng)裝箱腥泥。實(shí)際上匾南,必要時(shí)Groovy會(huì)自動(dòng)將基本類型視作對(duì)象。
- 字符串
單引號(hào)字符串是java.lang.String類型蛔外,同時(shí)不支持插值
-
雙引號(hào)字符串在沒有使用插值表達(dá)式情況下是java.lang.String類型蛆楞, 但如果有插值表達(dá)式使用的話,就是groovy.lang.GString類型
image.png 三引號(hào)字符串表示多行的字符串夹厌。不必將字符串分割成幾塊豹爹,也不必用連接符或換行符轉(zhuǎn)義字符來將字符串跨行
單引號(hào)單個(gè)字符要表示char類型,需要使用as轉(zhuǎn)換
${} 表達(dá)式進(jìn)行插值矛纹,去掉花括號(hào)不引起歧義的話臂聋,可以去掉
可以通過+=, -=操作符添加/減少字符 (會(huì)自動(dòng)匹配)
- def:動(dòng)態(tài)類型,使語言能夠根據(jù)上下文來判定變量類型,類似kotlin的var
- 已使用了final(不可變)孩等、private這樣的修飾符的時(shí)候艾君,可以省略
class Test{
static void main(String[] args) {
println(A())
}
static def A(){
"Hello Groovy"
}
}
-
數(shù)組和列表
- 數(shù)組和列表都是使用逗號(hào)分割列表的值,使用方括號(hào)括起來表示
- Groovy中的數(shù)組和列可以隨意轉(zhuǎn)換
- def定義的變量會(huì)自動(dòng)推斷 [ ] 類型是列表
-
Groovy列表是普通的JDK java.util.List肄方,因?yàn)镚roovy中沒有定義自己的集合類
image.png
image.png
?.實(shí)現(xiàn)安全操作符
class Test{
static void main(String[] args) {
println(test("niamkaep"))
println(test(null))
}
static def test(str){
str?.reverse()
}
}
- 范圍
范圍是一種特殊的列表冰垄,由序列中的第一個(gè)和最后一個(gè)值表示,Range可以是包含或排除权她。包含范圍包括從第一個(gè)到最后一個(gè)的所有值播演,而獨(dú)占范圍包括除最后一個(gè)之外的所有值。也可以使用表達(dá)式來表示范圍伴奥,例如:- 1..10 包含范圍的示例;相當(dāng)于[0,10]
- 1..<10 獨(dú)占范圍的示例 (開區(qū)間)翼闽;相當(dāng)于[0,10)
- 'a'..'z' 范圍也可以由字符組成拾徙;
- 10..1 范圍也可以按降序排列;
- 'z'..'a' 范圍也可以由字符組成并按降序排列
class Test{
static void main(String[] args) {
( 'z'..'a' ).forEach({
print(it+"\t")
})
}
}
- 映射
- 映射(也稱為關(guān)聯(lián)數(shù)組感局,字典尼啡,表和散列)是對(duì)象引用的無序集合。
- Map集合中的元素由鍵值訪問询微。Map中使用的鍵可以是任何類崖瞭,如果不能推斷具體key類型,默認(rèn)就是字符串撑毛。
- 在Groovy中可以使用特定的表述方式來指定映射:
- [k1:v1书聚,k2:v2] 具有鍵值對(duì)的集合。
- [:] 空映射
class Test{
static void main(String[] args) {
def map=[a:1,b:444]
map.forEach{k,v->
println("key=${k.class}")
}
}
}
- 運(yùn)算符及控制語句
- Groovy支持運(yùn)算符重載
- 循環(huán)語句
- 除了和Java保持差不多的用法外藻雌,還支持結(jié)合范圍的用來進(jìn)行循環(huán)
- 組合閉包來實(shí)現(xiàn)更簡(jiǎn)化的循環(huán)操作
- 條件語句
- 除了和Java保持差不多的用法外雌续,還多了Groovy的一些擴(kuò)展
- 可以組合閉包實(shí)現(xiàn)更靈活的條件語句
方法
getter/setter
- 默認(rèn)會(huì)生成getter, setter方法:
- 并且可以直接像使用成員變量的方法來自動(dòng)判斷調(diào)用getter/setter。
- 當(dāng)進(jìn)行賦值時(shí)調(diào)用setter方法胯杭,
- 當(dāng)直接訪問值時(shí)調(diào)用的是getter方法驯杜。
- 使用'.@'才是真正的直接訪問變量,跳過默認(rèn)的getter/setter方法調(diào)用
class Person{
private def name="peakmain"
private def getName() {
println("getName")
return name
}
}
class Test{
static void main(String[] args) {
def person = new Person()
println(person.@name)
}
}
private
- 所有的變量默認(rèn)是public
- 如果要設(shè)置為私有禁止直接訪問,僅僅設(shè)置private無用做个,放在另一個(gè)package也不行
- 重載這個(gè)變量的getter/setter方法鸽心,并且再調(diào)用方法時(shí)拋出異常
class Person{
private def name="peakmain"
private def getName() {
throw new IllegalAccessException("can not get")
return name
}
}
class Test{
static void main(String[] args) {
def person = new Person()
println(person.name)
}
}
- Java中如果沒有顯式的指定訪問修飾符(public、protected居暖、private)那么默認(rèn)是包訪問權(quán)限顽频,Groovy使用@PackageScope
構(gòu)造方法
- 構(gòu)造方法重載規(guī)則跟Java一樣。
- 如果沒有指定具體參數(shù)的類型時(shí)膝但,默認(rèn)推斷類型是Object冲九。
- 在構(gòu)造方法中傳入具名參數(shù),但是要注意:傳入的參數(shù)都是鍵值對(duì),實(shí)則就是一個(gè)Map類型莺奸!
- 這種方式傳入的參數(shù)會(huì)自動(dòng)拆解Map并且調(diào)用setter方法對(duì)應(yīng)的進(jìn)行賦值丑孩。
- 優(yōu)先是當(dāng)成Map匹配構(gòu)造方法,如果匹配不到則調(diào)用無參的構(gòu)造方法
class Person{
def name
def age
}
class Test{
static void main(String[] args) {
def person = new Person(name: "123", age: 123)
println(person.name)
}
}
- 如果參數(shù)中還有非鍵值對(duì)的傳參灭贷,就會(huì)把這些鍵值對(duì)當(dāng)成Map了不會(huì)再進(jìn)行自動(dòng)拆解賦值温学。所以要有對(duì)應(yīng)的構(gòu)造方法才行。
閉包
- Groovy中可以理解為閉包就是可執(zhí)行的代碼塊甚疟,或匿名函數(shù)仗岖。閉包在使用上與函數(shù)與許多共通之處殴俱,但是閉包可以作為一個(gè)函數(shù)的參數(shù)
- 默認(rèn)情況下钾唬,閉包能接收一個(gè)參數(shù)塘慕,且參數(shù)字段默認(rèn)使用it
class Test {
static def Person = {
println(it)
}
static void main(String[] args) {
Person(111)
}
}
- 在箭頭前面沒有定義參數(shù)愉舔,這時(shí)候閉包不能傳入?yún)?shù)
- 可以定義多個(gè)接收的參數(shù)
- 使用參數(shù)默認(rèn)值舟舒,跟方法使用規(guī)則一樣
閉包與接口/類進(jìn)行轉(zhuǎn)換
- 即使定義的方法傳入的是閉包房揭,但是如果傳入的對(duì)象的類型也有call方法贤笆,那么现斋,是可以執(zhí)行這個(gè)對(duì)象的call方法的府树,實(shí)際上俐末,閉包執(zhí)行的也是call方法。
- 在一個(gè)對(duì)象上調(diào)用()奄侠,表示調(diào)用這個(gè)對(duì)象的call方法
interface Action {
void call()
}
static void func(closure) {
closure()
}
static void main(String[] args) {
func(new Action(){
@Override
void call() {
println("測(cè)試")
}
})
}
閉包重要的參數(shù)
- private Object delegate;
默認(rèn)就是owner卓箫,但是代理可以修改 - private Object owner;
定義它的時(shí)候的類的對(duì)象 - private Object thisObject;
- private int resolveStrategy;
閉包參數(shù)的優(yōu)先級(jí) - protected Class[] parameterTypes;
閉包的參數(shù)類型 -
protected int maximumNumberOfParameters;
參數(shù)類型的個(gè)數(shù)
image.png
代理策略
class Test {
def func() {
println("func")
}
static def clouse = {
func()
}
static void main(String[] args) {
clouse.delegate = new Test()
clouse()
}
}
- groovy.lang.Closure#DELEGATE_FIRST
delegate優(yōu)先 - groovy.lang.Closure#DELEGATE_ONLY
只在delegate中找 - groovy.lang.Closure#OWNER_FIRST
owner優(yōu)先 - groovy.lang.Closure#OWNER_ONLY
只在owner找 - groovy.lang.Closure#TO_SELF
只在自身找(閉包內(nèi)部),意義不大