最近打算研究下Android的编译工具gradle,说起来使用也快2年了,但是之前文档啥的都不太多,也没啥时间来深入研究一下,现在准备换工作,有时间了,来搞一搞。
首先介绍下groovy—-gradle使用的语言。
groovy其实是一个java的简化版本,它基于java,并且优化了一些java的语法特性,开发者可以用脚本语言的形式来编写代码,但是其实底层还是把groovy编译成java类,对于喜欢使用java且不太会python等脚本语言的开发者来说,是一个不错的东西。
语法简介
groovy网站 http://www.groovy-lang.org ,虽然gradle自带了编译器,但是建议想学习groovy的同学们还是下载一个安装包,这样在平时的工作中也可以使用一下groovy。groovy的语法糖还是很多的,这里主要介绍下我觉得比较好的地方。
脚本特性
groovy执行有多种方式,可以直接在命令行执行,也可以保存为文件(下面例子需要先安装groovy)
#方式一:
groovy -e "10.times{println('cc')}"
#方式二
groovy MyScript.groovy
#或者
groovy MyScript
#方式三
groovyc MyScript.groovy
java -cp %GROOVY_HOME%/embeddable/groovy-all-2.4.8.jar MyScript
类型优化
为什么要有类型定义?
在 Java 中,如果要声明一个 String变量,则必须输入:
String value = "Hello World";
但是,如果仔细想想,就会看出,等号右侧的字符已经表明 value的类型是 String。所以,Groovy 允许省略 value前面的 String类型变量,并用 def代替。
def value = "Hello World"
除了输出 value的值,还可以用以下调用输出它的类型:
def message = "Hello World"
println message.class
函数定义时,参数的类型也可以不指定。比如
String function(arg1,args2){//无需指定参数类型
}
除了变量定义可以不指定类型外,Groovy中函数的返回值也可以是无类型的。比如:
//无类型的函数定义,必须使用def关键字
def nonReturnTypeFunc(){
last_line //最后一行代码的执行结果就是本函数的返回值
}
//如果指定了函数返回类型,则可不必加def关键字来定义函数
String getString(){
"I am a string"
}
** groovy中最后一行代码就是函数的返回值 **
简写
groovy中定义的函数,如果至少有一个参数,在调用的时候可以省略括号。比如这样
def func(String a){
println(a)
}
func 'hello'
在gradle有大量省略括号调用函数的例子,比如
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
默认修饰符为public
class Test{
String name;
}
public成员变量默认有get,set函数,例如上面的Test类
println("my name is " + new Test().getName())
自动导入常用java库, 使用file等文件无需导入,但是一些第三方的还是需要import
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.net.*
java.io.*
java.math.BigInteger
java.math.BigDecimal
变量引用
def nick = 'Gina'
def book = 'Groovy in Action'
assert "$nick is $book" == 'Gina is Groovy in Action'
list/map/range
def listA = ['1','2','3']
println(listA[1]) //'2'
def http = [ 100 : 'CONTINUE', 200 : 'OK']
println(http[200]) //'ok'
def x = 1..10
assert x.contains(5)
assert x.size() == 10
assert x.from == 1
assert x.to == 10
for(i in x) ...
闭包 (重点,后面的gradle经常使用)
很多C程序员,都习惯传递方法指针作为方法的参数,但是在java里,却无法做到这一点,现在groovy福利来了,这就是闭包()
参考文章: