简介
大家现在在用AndroidStudio开始一个工程的时候,都会发现在自己的工程目录中除了必须的工程代码以及各种资源文件外,还有一些后缀为.gradle的文件,这些就是gradle的配置文件。那么问题来了,什么是gradle呢?这里先介绍一下“构建”的概念。
所谓构建,即build/make,是把一些零碎的东西放在一起,生成出有实际意义的产物的一个过程。直白一点说,就像是用一堆砖头水泥混凝土建造一栋大楼。而gradle,就是一种用来构建我们项目的工具。类似的工具还有我们熟知的ANT,Maven。这两个工具已经存在很久了,二者都有或多或少的缺点,现在仍有不少人在用。
Gradle是一个基于Ant和Maven概念的项目自动化构建工具,使用一种叫groovy的DSL(领域专用语言),这种语言的语法非常独特,最大的特点就是一个字——简单。打开你工程目录下的build.gradle文件,你所看到的一切便是groovy的语句了。
到这里,读者或许已经发现了,要想学习使用gradle构建自己的项目,首先要学习groovy这种语言。那么就让我们来看看这groovy究竟为何物吧
groovy
groovy简介
groovy是一种基于jvm虚拟机的动态语言,语法简单,对于学过python等语言的人来说上手很快。groovy完全兼容java,又在java的基础上增加了很多动态类型和灵活的特性,比如闭包,dsl等。在这里我将简单的介绍一下groovy的语法,主要是和gradle相关的部分。
groovy语法
0x00准备知识
- groovy语句每一行可以不用分号结尾,当然加了分号也不会有问题
- groovy资磁动态类型,即定义变量时可以不指定其类型,同时定义变量可以写def xxx,def也可以不写
0x01数据类型
学习一门语言首先自然要知道她支持哪些数据类型。groovy基于java,她的数据类型除了java中基础类型和容器类外,有一个很重要都东西叫做“闭包”。作为一门动态语言,他的基础类型,诸如int,boolean等在书写时区分不是很明显,可以统统当做字符串来处理会好理解很多。在groovy中定义字符串可以用双引号也可以用单引号,区别在于单引号中的字符串是一个常亮,引号里面是什么就是什么,而双引号会对引号中的内容做计算。比如:
task Demo<<{
def name="Demo"
println '单引号:{name}'
println "双引号:${name}"
}
这样输出的内容为:
单引号:{name}
双引号:Demo
groovy的容器类型有三种:
- List:链表(底层对应java的List接口)
- Map:键-值对应表
- Range:基于List的一种扩展
定义时,对于List,只需这样写:
def demo_list =['a','b','c']
访问元素可以按下标索引访问也可以迭代操作来获取。用下标索引时不用担心越界,List会自动扩展
demoe_list[-1]=100
println demo_list[1]
println demo_list[1..2]
demo_list.each{
println it
}
map的定义:
def deno_map=['key1':a,'key2':b,'key3':c]
访问map元素:
println demo_map['key1']
println demo_map.key2
demo_map.each{
println "key=$it.key},value=${it.value}"
}
0x02.函数/方法
在java中,我们要定义一个方法/函数时,必须要声明返回类型,如果没有,则为void;只要返回类型不是void,还必须在函数体中的代码执行完后写return返回一个值;同时,如果函数需要参数,则还要在括号中写明,具体的的格式是这样的:
int fun(int a,int b){
return a+b;
}
而在groovy中,可以不写返回类型,此时必须要加上def;也可以不写return返回值,此时最后一行代码的执行结果就是返回值;而函数的参数类型可以不指定,也可以是代码块(后面要讲到的闭包):
//最死板的写法
def String demo_function(String s){
s="demo"
return s
}
//比较浪的写法
String demo_function(s){
s="demo"
}
def demo_function(s){
s="demo"
}
//将代码块(闭包)作为参数传递给函数
object.fun({
println it
})
//如果函数的最后一个参数是闭包,可以把这个闭包放在外面,括号也可以省略
object.fun{
println it
}
//上面的代码就是我们在build.gradle中经常看到的,是不是感觉很眼熟?
0x03.闭包
所谓闭包(Closure),是一种数据结构,包含了一段代码,在写法上与函数有相似之处,具体的定义格式如下:
def demo_closure{
String param->
println param
return param
}
定义闭包时,需要用花括号把要处理的代码快包起来;如果要定义参数,需要在参数定义之后在后面加上->,否则直接在花括号内写代码;闭包如果只有一个参数时,可以不用声明,在代码块中调用这个参数时默认可以隐藏的参数it来代替(容器类的each函数及是如此);如果定义闭包时没有定义参数但是有->符号,则这个隐藏参数it也就不存在了,此时调用闭包时不可传递参数;代码块如果有返回值,可以用return返回,也可以不谢return,这样就和函数的定义一样,默认把最后一行的结果作为返回值。
定义好闭包,就可以使用他了。使用闭包也很简单,有如下两种方式:
closureObject.call("demo")
closureObject("demo")
0x04.其他“骚”操作
1.脚本
groovy是一门基于java的语言,所以有很多和java相近的地方,这里做一些简介。
首先,java有”类“这样一个概念,groovy也是。groovy的类可以和java中一样,在类文件首行写:
package com.levent_j
在书写类时,也和java一样,可以有public\private来修饰,用import来引用其他类:
class Demo{
String param1
String param2
//......
}
import com.levent_j.groovy.Demo1
def demo=new Demo("a","b")
//......
与java不同的是,java中每个类文件必须要写一个class(或者interface等),而groovy没有这么严格的要求。groovy文件中如果出现了class,那么他是一个类似于java中的类。也可以把要做的一堆操作直接扔到单个的groovy文件中,这样就是一个脚本类,在执行时可以直接执行这个.groovy后缀的脚本。前面说过,groovy是基于java的语言,那么他和java是怎么联系起来的呢?其实groovy在执行时会首先把.groovy文件中的内容转换为一个java中的类,然后提供一个main函数,并由run()方法来执行。注意,在脚本类中操作时一定要注意定义的函数和参数及其作用域。脚本类中定义的函数是作为这个类的成员变量的,而定义的参数如果在定义时加上了def 和类型时,在转为java类后是在run()函数中定义的,因此如果要在函数中使用当前脚本类中定义的参数时,定义的参数前面不要加def 和类型,不过这样定义的参数,其他的脚本却无法访问。要解决这个问题,需要在脚本文件开头加上
import groovy.transform.Field;
并在定义参数时在前面加上@符号。至于原因就需要大家自己看看转为java类后的代码了。
2.io操作
groovy对文件的读取操作只需两步,第一步创建file对象,第二步就是调用各种方法操作文件。
def demo_file = new File(文件名)
有了这个文件对象,就可以花式读取文件了。官方api文档写的很清楚:
demo_file.eachLine{
//对每一行进行操作
}
demo_file.getBytes()//一次性读取整个文件内容并以byte[]格式储存
def ism = demo_file.newInputStream()//使用inputstream操作,结束后需要手动close
demo_file.withInputStream{
ism->
//使用闭包操作inputstream,操作结束不必手动close,groovy会自动帮我们close
}