在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

Gradle入門知識(shí)之Gradle語(yǔ)法1

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

前言:

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

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

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

這些都是啥wy啊。。

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

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

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

Gradle`定義:

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

誠(chéng)然Gradle確實(shí)是用來(lái)做構(gòu)建,但是如果簡(jiǎn)單得把Gradle拿來(lái)做構(gòu)建,就太小看Gradle了.

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

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

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

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

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

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

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

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

所以在gradle構(gòu)建過(guò)程中,我們完全可以使用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)鍵配置扔給我們開(kāi)發(fā)者,開(kāi)發(fā)者配置好任務(wù)后,無(wú)需關(guān)心gradle是如何構(gòu)建的。

缺點(diǎn):

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

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

Groovy語(yǔ)法詳解

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

1.編程方式

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

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

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

package variable

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

2.語(yǔ)法簡(jiǎn)潔

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

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

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

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

    • 單引號(hào):不能使用+號(hào)代替,如果你確定這個(gè)字符串只是使用,不會(huì)更改那么你可以這么定義

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

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

    • 三引號(hào):支持自動(dòng)換行

      一般我們會(huì)使用前兩種,最后一種很少用

  • 2.5:使用弱聲明:def,編譯過(guò)程會(huì)自動(dòng)類型檢測(cè),這個(gè)屬性和kotlin的val/var很像。

    java
    def str = "this is groovy str"

3.方法

3.1: 方法定義

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

def echo(){
    return "echo this"
}

3.2:方法參數(shù):

groovy傳入的參數(shù)可以省略參數(shù)類型,且可以設(shè)置參數(shù)默認(rèn)值,有默認(rèn)值調(diào)用的時(shí)候可以省略帶默認(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)行期動(dòng)態(tài)添加方法

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

圖片

gradle方法.png

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

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

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

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

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

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

注入屬性:
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:對(duì)應(yīng)java中的List
def list = [1, 2, 3, 4,5,6]
  • 映射Map:對(duì)應(yīng)java中的Map
def map = [key1:'value',key2:'value2']

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

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

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

如下使用:

/******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ì)個(gè)數(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)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2986

    瀏覽量

    107060
  • 開(kāi)發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    373

    瀏覽量

    41381
  • gradle
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    856
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    gradle安裝與配置unity

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

    Android Studio與Gradle深入

    小語(yǔ)言規(guī)范用來(lái)處理一個(gè)特定的事情(大多情況下是配置)。Android 的插件的 DSL 文檔在 Android Gradle DSL有說(shuō)明。  理解了以上基礎(chǔ)之后,你就會(huì)知其然,知其所以然了。  以上知識(shí)
    發(fā)表于 08-31 17:58

    Gradle for Android

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

    請(qǐng)問(wèn)OpenHarmony鴻蒙demo gradle報(bào)錯(cuò)怎么解決?

    [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)槟闶沁@個(gè)Gradle的迷,第一覺(jué)得Gradle是一門獨(dú)立的語(yǔ)言呀,如果想進(jìn)入歧途了,我一開(kāi)始也是這么迷糊的,當(dāng)你了解之后,你就可以這么理解
    的頭像 發(fā)表于 04-08 10:56 ?1615次閱讀
    快速<b class='flag-5'>入門</b><b class='flag-5'>Gradle</b>的方法

    Gradle入門知識(shí)Gradle詳解

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

    Gradle入門知識(shí)Gradle詳解(下)

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

    Gradle入門知識(shí)Gradle語(yǔ)法2

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

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

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

    Gradle入門知識(shí)Gradle語(yǔ)法3

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

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

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

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

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

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

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過(guò)程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:50 ?1460次閱讀
    主站蜘蛛池模板: 国产视频一二区 | 免费国产一区二区三区 | 亚洲 欧美 成人 | 天天爽夜夜爽夜夜爽精品视频 | 精品国产欧美一区二区最新 | 草色网| 又粗又长又大真舒服好爽漫画 | 久久综合爱| 性欧美巨大 | 天天干天天拍天天射天天添天天爱 | 久久午夜宅男免费网站 | 四虎最新影院 | 男男扒开后菊惩罚 | 免费一级特黄特色大片在线观看 | xxxx人成高清免费图片 | 高h细节肉爽文bl1v1 | 亚洲aaa视频 | 欧美四级在线 | 日日摸人人拍人人澡 | 国产乱子伦一区二区三区 | 亚洲精品资源在线 | 国产精品免费拍拍拍 | 黄色片视频网 | 午夜视频在线免费观看 | 男男全肉高h腐文 | 羞羞色院91精品网站 | 狠狠成人 | 亚洲码欧美码一区二区三区 | 国产欧美日韩综合精品无毒 | 国产免费一级在线观看 | 黄色小视频免费 | 97人人干| 美女张开腿让男生桶出水 | 天堂在线天堂最新版在线www | 国产黄色三级三级三级 | 国产va精品免费观看 | 成年大片免费播放视频人 | 国产免费人成在线看视频 | 免费高清在线观看a网站 | 一区二区三区久久 | 性欧美乱又伦 |