Gradle 学习之 Groovy 基础

news/2024/5/20 2:51:32 标签: gradle, android, Gradle 构建, java, DSL

一、什么是 Groovy

1. 官网:

http://www.groovy-lang.org/

2. 概念:

是基于 JVM 虚拟机的一种动态语言,语法上和 Java 非常相似,完全兼容 Java,可以说是一门非常灵活的动态脚本语言

3. 应用:

Gradle 的 build 脚本文件都是一个 Groovy 脚本文件,是使用 Groovy 进行编写的

二、基础语法

由于我们是在学习 Gradle 尤其是 Android Gradle,所以一开始对于 Groovy 不需要掌握得非常深刻,我们这里就对一些语法概念稍作学习,目的是可以读懂 Gradle 相关脚本文件的一些代码和编写简单的脚本文件,等 Gradle 学习深入后再去了解 Groovy 的高级特性

1. 如何定义一行代码的结束

Groovy 中,每一行的结束不是一定要用分号的,直接换行即可,当然也可以保持 Java 习惯,写上分号

2. 定义标识符

def 是 Groovy 用来定义标识符关键字

// 定义一个字符串变量 nicholas 它的值为 hzf
def nicholas = "hzf";
// 定义一个方法 buildString,接收两个字符串参数,返回它们拼接的结果
def buildString(String a, String b){
	println "$a-$b"
}

3. 方法

A.)括号可省略: 调用方法的时候,可以省略括号,如 #2

task methodTest {
    buildString("Nicholas","hzf") // #1
    buildString "Nicholas","hzf" // #2
}

def buildString(String a, String b){
	println "$a-$b"
}

括号可省略
B.)return 可不写: 方法中没有写 return 语句,则方法执行过程中的最后一句代码的值作为返回值

task methodTest {
    def result = chooseSmallNum 1,10
    println result
}

def chooseSmallNum(int a, int b){
	if (a <= b) {
		a
	}else {
		b
	}
}

return 可不写
C.)代码块可作为参数传递
代码块: 代码块就是闭包,通俗来说就是一段被大括号包裹起来的代码
演化:
#1 是初始写法,比较繁琐
#2 Groovy 规定如果方法的最后一个参数是闭包,可以放到方法后面
#3 刚才说到方法调用时,括号可以省略,所以综上三种写法都是可以的,最为常见的是 #3 这种写法,了解完转化写法后就会觉得直观又简洁

task methodTest3 {
    doSomething("Nicholas0","hzf",{a,b -> println "$a-$b"}) // #1
    doSomething("Nicholas1","hzf"){ a,b -> // #2
    	println "$a-$b"
    }
    doSomething "Nicholas2","hzf",{ a,b -> // #3
    	println "$a-$b"
    }
}

def doSomething(String a, String b, Closure method){ // Closure 定义闭包
	method.call(a,b) // call 调用闭包
}

代码块可作为参数传递

4. JavaBean

在 Groovy 中,并不是一定要定义成员变量才可以作为一个类的属性进行访问,只要写了 getter/setter 方法,也一样可以作为属性进行访问。如果只写了 getter 方法,那不可以修改该属性的值,如例子中的 age 属性;反之,如果只写了 setter 方法,那就无法访问到这个属性

task javaBeanTest {
    Person p = new Person()
    // Groovy 中的 private 定义的属性竟然可以直接访问!!!
    p.name = "Nicholas"
    println p.info
}

class Person {
	private String name;
	public int getAge(){24}
	public setInfo(String info){}
	public String getInfo(){
		"$name-$age"
	}
}

JavaBean

5. 字符串

Groovy 中提供了三种表示 String 的方法:单引号(’),双引号(")或三引号(’’’)括起来。其中,单引号括起来的字符串没有运算能力,如 #1 所示 $strB 原模原样的打印出来了;由三引号括起来的字符串可以跨越多行

task stringTest {
	def strA = '单引号'
    def strB = "双引号"
    def strC = '''
---三引号---
'''
    println strA
    println strB
    println strC
    println '单引号==$strB' // #1
    println "双引号==$strB"
    println '''三引号==$strC'''
}

字符串

6. 集合

对于 List 来说,Groovy 提供下标索引的方式进行访问,值得注意的是,除了普通的下标索引,还有负下标索引和范围索引的方式

task listTest{
	def nameList = ["Nicholas","hzf","Groovy","Java","Kotlin","Android","Gradle"]
	println nameList[0] // 正数第一个
	println nameList[1] // 正数第二个
	println nameList[-2] // 倒数第二个
	println nameList[-1] // 倒数第一个
	println nameList[0..2] // 正数第一个到第三个
	println nameList[-1..1] // 倒数第一个到正数第二个,倒着打印
}

集合测试

7. 闭包

A.)概念: 由大括号括起来的一段代码
下面例子中的 {println it}{k,v -> println "$k-$v"} 都是闭包

task closureTest{
	// listEach 的参数是闭包
	// 即 {println it}
	listEach {
		println it // 闭包只有一个参数的时候,默认就是 it
	}
	// mapEach 的参数是闭包
	// 即 {k,v -> println "$k-$v"}
	mapEach { k,v ->
		println "$k-$v" // 闭包不只一个参数的时候,需要把参数一一列出
	}
}
// 方法 listEach 只有一个参数,用于接收一个闭包参数
def listEach(closure){
	def nameList = ["Nicholas","hzf","Groovy","Java","Kotlin","Android","Gradle"]
	nameList.each {
		closure(it)
	}
}
// 方法 mapEach 只有一个参数,用于接收一个闭包参数
def mapEach(closure){
	def map = ["Nicholas":"hzf","Gradle":"Groovy","Android":"Kotlin"]
	map.each {
		closure(it.key,it.value)
	}
}

闭包测试
B.)闭包委托

  • 闭包的三个属性:thisObject,owner,delegete 在闭包内调用方法时,由这三个参数决定使用哪个对象来调用这个被调用的方法:比如说,闭包内执行了方法 A(),那这个 A() 是脚本中的方法 A,还是某个类中的方法 A
  • thisObject 构建脚本的上下文,和脚本中的 this 相等
  • 默认情况下 delegete 与 owner 是相等的,但是 delegete 可以被修改,修改后就和 owner 不相等了
  • 闭包方法内处理的顺序:thisObject > owner > delegete
  • 在 Gradle 中,一般指定 delegate 为当前的 it
task closureTest2{
	createBook {
		bookName = "Android Gradle 权威指南"
		author = "飞雪无情"
		pageNum = 236
		dumpBook()
	}
}

class Book{
	String bookName
	String author
	int pageNum

	def dumpBook(){
		println "in dumpBook bookName==$bookName, pageNum==$pageNum, author$author"
	}
}

def createBook(Closure<Book> closure){
	Book book = new Book()
	closure.delegate = book
	closure.setResolveStrategy(Closure.DELEGATE_FIRST)
	closure(book)
}

def dumpBook(){
	println "out dumpBook"
}

闭包委托

DSL_196">三、DSL

1. 概念:

Domain Specific Language 领域特定语言

2. 特点:

  • 在于而不在于
  • 领域专家通过描述领域中的所有活动和规则,制定出某个特定领域的 DSL,这样就可以方便普通程序员在不是特别了解该领域原理的情况下,还能实现相关功能

3. Gradle

Gradle 就是一门 DSL,基于 Groovy,专门用于解决自动化构建的问题。程序员即使不了解自动化构建的原理,按照 Gradle 的语法,编写相关的脚本代码,也可以完成项目的自动化构建


整理学习自飞雪无情大佬的《Android Gradle 权威指南》和互联网资料


http://www.niftyadmin.cn/n/1252350.html

相关文章

20 分钟就被淘汰的高级前端工程师

最近面了一个4 年经验的前端开发&#xff0c; 应聘的是前端高级开发工程师。他的简历中提到很多技术点&#xff0c;从 HTML、CSS、JavaScript 再到 Vue.js 和 React 一个都不缺&#xff0c;跨平台PC、移动端、小程序也都经历过&#xff0c;看着像个实战派。深度聊了聊&#xff…

Gradle 学习之基础项目脚本

目录一、settings.gradle 文件二、build.gradle 文件三、项目与任务四、书写 Gradle 脚本代码的本质一、settings.gradle 文件 作用&#xff1a; 作为项目的设置文件&#xff0c;用于项目初始化以及多工程&#xff08;子工程&#xff09;的配置默认名称&#xff1a; settings.…

递归手写深拷贝

前言 深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。 1. 堆栈内存 具体看另一篇博客js的数据类型、堆栈内存 浅拷贝与深拷贝 深拷贝和浅拷贝的示意图大致如下&#xff1a; 浅拷贝只复制指向某个对象的指针&#xff0c;而不复制对象本身&#xff0c;新旧对象还…

你应该知道的 13 个数组技巧【略骚】

数组是Javascript最常见的概念之一&#xff0c;它为我们提供了处理数据的许多可能性。您可以在编程开始之初就了解它&#xff0c;在本文中&#xff0c;我想向您展示一些您可能不知道并且可能非常有用的技巧。有助于编码&#xff01;让我们开始吧。1. 数组去重这是一个非常流行的…

Gradle 学习之任务 Task

目录一、多种方式创建任务二、多种方式访问任务三、任务分组与描述四、任务的执行分析五、任务排序六、任务的启用和禁用七、任务的 onlyIf 断言八、任务规则一、多种方式创建任务 1. 以任务名称创建任务 示例&#xff1a; // 以任务名称创建任务 def Task taskCreatedByNam…

Gradle 学习之插件介绍

目录一、Gradle 设计介绍二、Gradle 插件介绍1. 二进制插件2. 脚本插件3.应用第三方发布的插件一、Gradle 设计介绍 Gradle 的扩展性十分强&#xff0c;它本身提供基本的概念和整体的核心框架&#xff0c;其他的具体场景逻辑&#xff0c;都是以插件的形式进行扩展 Gradle 本身…

微任务与宏任务

微任务与宏任务 宏任务包括&#xff1a;setTimeout setInterval Ajax DOM事件微任务&#xff1a;Promise async/await注意&#xff1a;微任务比宏任务的执行时间要早下面请看例子 console.log(100);setTimeout(()>{console.log(200); })setTimeout(()>{console.log(201…

如何一句话激怒程序员

前言原本安静的办公室总是可以因为某个人的一两句话而变的热闹起来&#xff0c;进而发生或纯技术、或纯愤怒、或两者皆是的争吵……1、前端没有任何技术含量这是之前的一个后端的同事说的&#xff0c;当时小生内心已经在质疑他的智商了&#xff0c;不过嘴上说的是&#xff1a;你…