Gradle基礎(chǔ)到進(jìn)階——基本語法、方法和閉包(一)

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

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)部),意義不大
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垄潮,一起剝皮案震驚了整個(gè)濱河市烹卒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魂挂,老刑警劉巖甫题,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涂召,居然都是意外死亡坠非,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門果正,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炎码,“玉大人,你說我怎么就攤上這事秋泳×氏校” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵迫皱,是天一觀的道長(zhǎng)歉闰。 經(jīng)常有香客問我辖众,道長(zhǎng),這世上最難降的妖魔是什么和敬? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任凹炸,我火速辦了婚禮,結(jié)果婚禮上昼弟,老公的妹妹穿的比我還像新娘啤它。我一直安慰自己,他們只是感情好舱痘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布变骡。 她就那樣靜靜地躺著,像睡著了一般芭逝。 火紅的嫁衣襯著肌膚如雪塌碌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天旬盯,我揣著相機(jī)與錄音誊爹,去河邊找鬼。 笑死瓢捉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的办成。 我是一名探鬼主播泡态,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼迂卢!你這毒婦竟也來了某弦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤而克,失蹤者是張志新(化名)和其女友劉穎靶壮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體员萍,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腾降,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碎绎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螃壤。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筋帖,靈堂內(nèi)的尸體忽然破棺而出奸晴,到底是詐尸還是另有隱情,我是刑警寧澤日麸,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布寄啼,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏墩划。R本人自食惡果不足惜涕刚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望走诞。 院中可真熱鬧副女,春花似錦、人聲如沸蚣旱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塞绿。三九已至沟涨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間异吻,已是汗流浹背裹赴。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诀浪,地道東北人棋返。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像雷猪,于是被迫代替她去往敵國(guó)和親睛竣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容