0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Gradle入門知識之Gradle語法1

jf_78858299 ? 來源:小余的自習(xí)室 ? 作者:小余的自習(xí)室 ? 2023-03-30 10:54 ? 次閱讀

前言:

大家回想一下自己第一次接觸Gradle是什么時候?

相信大家也都是和我一樣,在我們打開第一個AS項(xiàng)目的時候,

發(fā)現(xiàn)有很多帶gradle字樣的文件:setting.gradle, build.gradle,gradle.warpper,以及在gradle文件中各種配置,

這些都是啥wy啊。。

特別對于一些小公司開發(fā)人員,因?yàn)榻佑|架構(gòu)層面的機(jī)會很少,可能在使用AS幾年后都不一定對Gradle有太多深入了解,這是實(shí)話,因?yàn)楣P者就是這么過來的。。

Gradle又是進(jìn)階高級開發(fā)的必經(jīng)之路。

好了,接下來進(jìn)入正題,此系列筆者會由淺入深的方式,帶領(lǐng)大家來了解下,Gradle背后究竟有哪些奧秘。

Gradle`定義:

很多開發(fā)喜歡把Gradle簡單定義為一種構(gòu)建工具,和ant,maven等作用類似,

誠然Gradle確實(shí)是用來做構(gòu)建,但是如果簡單得把Gradle拿來做構(gòu)建,就太小看Gradle了.

筆者更愿意將Gradle看做一種編程框架。在這個框架中,你可以做很多ant,maven等常用構(gòu)建工具做不了的事情,

如將自己的任務(wù)task集成到構(gòu)建生命周期中,完成文件拷貝,腳本編寫等操作。

Gradle優(yōu)缺點(diǎn):

相較早期的構(gòu)建工具:ant,maven等。

優(yōu)點(diǎn)如下:

  • 1.使用DSL Grovvy語言來編寫: :了解ant的同學(xué)應(yīng)該都知道:ant使用的是xml配置的模式,而Gradle使用的是表達(dá)性的Groovy來編寫,

    Groovy同時支持面向?qū)ο蠛兔嫦蜻^程進(jìn)行開發(fā),這個特性讓Groovy可以寫出一些腳本的任務(wù),這在傳統(tǒng)ant,maven上是不可能實(shí)現(xiàn)的

  • 2.基于java虛擬機(jī): :Groovy是基于jvm的語言,groovy文件編譯后其實(shí)就是class文件,和我們的java一樣。

所以在gradle構(gòu)建過程中,我們完全可以使用java/kotlin去編寫我們的構(gòu)建任務(wù)以及腳本,極大的降低我們學(xué)習(xí)的成本。

  • 3.Gradle自定義task :可以構(gòu)建自己的任務(wù),然后掛接到gradle構(gòu)建生命周期中去,這在ant,maven上也是不可能實(shí)現(xiàn)的,
  • 4.擴(kuò)展性好 :gradle將關(guān)鍵配置扔給我們開發(fā)者,開發(fā)者配置好任務(wù)后,無需關(guān)心gradle是如何構(gòu)建的。

缺點(diǎn):

用過gradle都知道,低版本gradle的項(xiàng)目在高版本的gradle中經(jīng)常出現(xiàn)很多莫名其妙的錯誤,向后兼容性較差。

介紹了那么多,下面正式來講解今天的主角:Groovy

Groovy語法詳解

因?yàn)槲覀兊腉roovy和java很類似,所以這里我們以和java的差異性進(jìn)行展開,這樣可以更好的去理解groovy語法

1.編程方式

java:面向?qū)ο?/p>

groovy:面向?qū)ο蠛瓦^程

groovy不僅可以和java一樣面向?qū)ο筮M(jìn)程編程,也可以創(chuàng)建面向過程的腳本開發(fā):

package variable

int i1 = 1
double d1 = 1
println(i1.class)
println(d1.class)

2.語法簡潔

  • 2.1:分號:groovy默認(rèn)行尾不加分號

  • 2.2:public:默認(rèn)屬性為public,而我們的java是protected

  • 2.3:setter/getter:groovy默認(rèn)給我們類內(nèi)部屬性,創(chuàng)建setter和getter方法,外部只需要使用屬性名訪問即可

  • 2.4:字符串:groovy支持三種類型的字符串表達(dá)式定義

    • 單引號:不能使用+號代替,如果你確定這個字符串只是使用,不會更改那么你可以這么定義

      //單引號定義不可更改內(nèi)容
      def s1 = 's1'
      //使用轉(zhuǎn)移字符://s'a'2
      def s2 = 's\\'a\\'2'
      
    • 雙引號

      在字符串內(nèi)部可以使用圖片{2+3}"

    • 三引號:支持自動換行

      一般我們會使用前兩種,最后一種很少用

  • 2.5:使用弱聲明:def,編譯過程會自動類型檢測,這個屬性和kotlin的val/var很像。

    java
    def str = "this is groovy str"

3.方法

3.1: 方法定義

groovy中:使用def聲明方法的返回值,如果沒有返回值,則默認(rèn)返回一個null

def echo(){
    return "echo this"
}

3.2:方法參數(shù)

groovy傳入的參數(shù)可以省略參數(shù)類型,且可以設(shè)置參數(shù)默認(rèn)值,有默認(rèn)值調(diào)用的時候可以省略帶默認(rèn)值的參數(shù)

def echo(message,name = '123'){
    return "echo:"+message +name
}
調(diào)用:echo("hello groovy")

3.3:方法返回值

使用return返回,如果省略return,則返回的是最后方法最后一行

def echo(){
   "echo this"
}
println echo()

結(jié)果:"echo this"

3.4:方法調(diào)用流程

groovy方法調(diào)用不像我們java,其內(nèi)部給我們創(chuàng)建了很多判斷的分支,支持在運(yùn)行期動態(tài)添加方法

下面是groovy方法調(diào)用流程圖:

圖片

gradle方法.png

  • 3.4.1:invokeMethod:對于類中所有調(diào)用方法:包括已定義和未定義方法,都會走到這個invokeMethod方法中,需要實(shí)現(xiàn):GroovyInterceptable接口

    這個方法可以在我們方法執(zhí)行器做一些方法類型參數(shù)等判斷

class Person implements GroovyInterceptable{
                    def name
                    def age
                    def score

                    @Override
                    Object invokeMethod(String methodName, Object args) {
                            return "this method name is $methodName"
                    }

                    def helloGroovy(){
                            return "hello $name"
                    }

            }
            調(diào)用:
            def per = new Person(name: 'lily')
            println per.helloGroovy()
            println per.helloGroovy1()
            結(jié)果:
            this method name is helloGroovy
            this method name is helloGroovy1

可以看到所有的方法都被分派到invokeMethod且沒有執(zhí)行后續(xù)流程:這個和我們java運(yùn)行期動態(tài)代理模式有點(diǎn)類似,我們可以在invokeMethod中實(shí)現(xiàn)一些AOP的架構(gòu),如打印所有方法的統(tǒng)一日志等。

  • 3.4.2:methodMissing:對于未定義的方法,如果重寫這個methodMissing,則會調(diào)用這個方法
    Object methodMissing(String name, Object args) {
         println "methodMissing : $name"
    }
    

最新版本groovy未發(fā)現(xiàn)這個方法,應(yīng)該是被去掉了 。不過這個對于我們開發(fā)關(guān)系不大

  • 3.4.3:元編程metaClass:可以在運(yùn)行期注入屬性和方法包括靜態(tài)方法,這個特性就比較厲害了,對于一些第三方類庫,可以使用這個方式在運(yùn)行期動態(tài)創(chuàng)建方法,相當(dāng)于對類庫進(jìn)行了一次擴(kuò)展

學(xué)習(xí)過kotlin的都知道:擴(kuò)展函數(shù)和擴(kuò)展屬性,差不多是這個用法

注入屬性:
class Person implements{
    def name
    def age
}
//注入屬性
Person.metaClass.sex = 'male'
def person1 = new Person(name: 'yuhb',age: 29)
println person1.sex
結(jié)果:male

注入方法:
//注入方法,使用閉包
Person.metaClass.sexUpperCase = {  ->
    sex.toUpperCase()
}
println person1.sexUpperCase()
結(jié)果:MALE

4.集合

4.1:集合分類

groovy中集合有三種:

  • 列表List:對應(yīng)java中的List
def list = [1, 2, 3, 4,5,6]
  • 映射Map:對應(yīng)java中的Map
def map = [key1:'value',key2:'value2']

注意:map中的key默認(rèn)都是String類型的字符串,即使我們自己沒加,編譯器也會給我們加上

  • 范圍Range:groovy中獨(dú)有
def range = [1..100]

range其實(shí)就是指定了一個list的范圍,而不需要一個一個列出來

如下使用:

/******switch case*****/
println getGrade(87)
def getGrade(def number){
    def result
    switch (number){
            case 0..<60:
                    result = "不及格"
                    break
            case 60..<80:
                    result = "及格"
                    break
            case 80..100:
                    result = "優(yōu)"
                    break
            default:
                    result = "不確定"
                    break
    }
    result
}

4.2:集合遍歷

所有集合都可以使用eacheachWithIndex進(jìn)行遍歷,當(dāng)然也可以使用java中的for循環(huán),但在groovy中一般不這么用

class Stu{
    def name
    def age

    @Override
    String toString() {
        return "name:$name age:$age"
    }
}
def students = [
        1:new Stu(name: 'lily',age: 12),
        2:new Stu(name:  'lucy',age:  13),
        3:new Stu(name:  'tom',age:  14),
        4:new Stu(name:  'sara',age:  15)
]
/**1.遍歷**/
students.each {
    println it.value.toString()
}
/**帶索引遍歷**/
students.eachWithIndex{ Map.Entry<Integer, Stu> entry, int i ->
    println "index:$i key:$entry.key value:$entry.value "
}

4.3:查找

groovy中查找提供了findfindAll方法,用法如下:

//find查找一項(xiàng)
def stu1 = students.find {
    it.value.age>12
}
println stu1.value
//findAll查找所有項(xiàng)
def stus = students.findAll {
    it.value.age>12
}
//count:統(tǒng)計(jì)個數(shù)
def stuCount = students.count {
    it.value.age>12
}

//多重查找
def stu2 = students.findAll {
    it.value.age>12
}.collect {
    it.value.name
}

4.4:分組:

使用groupBy關(guān)鍵字

def group = students.groupBy {
    return it.value.age>12?"大":"小"
}

4.5:排序:

使用sort

def sort = students.sort {student1,student2 ->
    student1.value.age == student2.value.age?0:student1.value.age < student2.value.age?-1:1
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2970

    瀏覽量

    104814
  • 開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    370

    瀏覽量

    40861
  • gradle
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    726
收藏 人收藏

    評論

    相關(guān)推薦

    Gradle版本目錄功能的簡單應(yīng)用

    版本帝 Gradle 最新版本已經(jīng)到了 8.1.1 ,你是不是還在用著 Gradle 3 的功能?今天我們了解一下 Gradle 7.0 之后推出的新功能 Version Catalog 版本目錄
    的頭像 發(fā)表于 09-30 11:12 ?1366次閱讀

    gradle安裝與配置unity

    Gradle是一種用于構(gòu)建和自動化構(gòu)建過程的強(qiáng)大工具,而Unity則是一款跨平臺的游戲引擎。在Unity項(xiàng)目中使用Gradle可以幫助我們更方便地管理和構(gòu)建項(xiàng)目,同時能夠提供更高的自定義能力和穩(wěn)定性
    的頭像 發(fā)表于 12-07 14:48 ?2259次閱讀

    Android Studio與Gradle深入

    小語言規(guī)范用來處理一個特定的事情(大多情況下是配置)。Android 的插件的 DSL 文檔在 Android Gradle DSL有說明?! ±斫饬艘陨匣A(chǔ)之后,你就會知其然,知其所以然了?! ∫陨?b class='flag-5'>知識
    發(fā)表于 08-31 17:58

    Gradle for Android

    Gradle for Android
    發(fā)表于 07-16 15:50

    請問OpenHarmony鴻蒙demo gradle報錯怎么解決?

    [build_d4wwgdfsrmyu3wivei5s3deyo$_run_closure1@1db3e190] on root project 'HarmonyAPP' of type org.gradle.api.Project.Open File
    發(fā)表于 04-01 11:27

    快速入門Gradle的方法

    我們前面的Gradle是一門基于Groov的DSL,可能很多童鞋就是因?yàn)槟闶沁@個Gradle的迷,第一覺得Gradle是一門獨(dú)立的語言呀,如果想進(jìn)入歧途了,我一開始也是這么迷糊的,當(dāng)你了解之后,你就可以這么理解
    的頭像 發(fā)表于 04-08 10:56 ?1339次閱讀
    快速<b class='flag-5'>入門</b><b class='flag-5'>Gradle</b>的方法

    Gradle入門知識Gradle詳解

    大家回想一下自己第一次接觸`Gradle`是什么時候? 相信大家也都是和我一樣,在我們打開第一個AS項(xiàng)目的時候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:47 ?2534次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>詳解

    Gradle入門知識Gradle詳解(下)

    大家回想一下自己第一次接觸`Gradle`是什么時候? 相信大家也都是和我一樣,在我們打開第一個AS項(xiàng)目的時候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:51 ?873次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>詳解(下)

    Gradle入門知識Gradle語法2

    很多開發(fā)喜歡把`Gradle`簡單定義為一種構(gòu)建工具,和`ant,maven`等作用類似, 誠然Gradle確實(shí)是用來做構(gòu)建,但是如果簡單得把Gradle拿來做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?741次閱讀

    Gradle入門知識Gradle api解析(上)

    由于Project源碼篇幅太長:這里只列出類的部分方法和屬性: 我們前面分析過,每個build.gradle對應(yīng)一個Project,Project在初始過程中會被構(gòu)建為`樹`形結(jié)構(gòu):
    的頭像 發(fā)表于 03-30 11:01 ?2377次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b> api解析(上)

    Gradle入門知識Gradle語法3

    java中處理xml:使用的一般是dom文檔驅(qū)動處理或者sax事件驅(qū)動處理
    的頭像 發(fā)表于 03-30 11:04 ?758次閱讀

    Gradle入門知識Gradle api解析(下)

    由于Project源碼篇幅太長:這里只列出類的部分方法和屬性: 我們前面分析過,每個build.gradle對應(yīng)一個Project,Project在初始過程中會被構(gòu)建為`樹`形結(jié)構(gòu):
    的頭像 發(fā)表于 03-30 11:05 ?1093次閱讀

    Gradle Plugin和AGP的區(qū)別1

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:48 ?1229次閱讀
    <b class='flag-5'>Gradle</b> Plugin和AGP的區(qū)別<b class='flag-5'>1</b>

    Gradle Plugin和AGP的區(qū)別2

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:49 ?1171次閱讀

    Gradle Plugin和AGP的區(qū)別3

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:50 ?1264次閱讀