我们先来看一段gradle中的代码:

buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:2.1.2'}
}allprojects {repositories {jcenter()}
}task clean(type: Delete) {delete rootProject.buildDir
}task wrapper(type: Wrapper) {gradleVersion = '2.10'}

我第一次看gradle代码的时候是懵逼的,

这是哪门子语言,这到底是类似xml的标记语言还是类似java的语言?我不懂。不懂没关系,学了就懂了嘛。

大家现在已经知道了gradle使用groovy写的,所以他是我前面说的类似java的语言,但他是如何做到像上面这样炫酷吊炸天的写法呢?我们接下分析一下:

首先你在gradle中看不到;这是因为groovy支持不写;

println 'hello world'

下面我们看看这个:

dependencies {classpath 'com.android.tools.build:gradle:2.1.2'}

这个放在groovy中怎么解读呢?首先我们需要知道的是groovy中方法调用时可以省略()的!!!对你没有看错,正如上面的println 'hello world',ok,那不难理解上面的dependencies是一个方法名了,这里是一个方法的调用,而不是方法的定义。既然是方法的调用,那就可以知道{}实际上就是一个groovy的闭包类型的参数。而这个闭包里面又是个classpath的方法调用。

既然上面被我说通了,那就写个例子试试吧:

def dependencies(Closure cl){cl.call();
}def classpath(String path){println path
}dependencies {classpath 'com.android.tools.build:gradle:2.1.2'}

Look,代码运行正常。

那么我们再来看这个:

task clean(type: Delete) {delete rootProject.buildDir
}

这个用上面的思路套进去看看呢?task是一个方法,没毛病。后面是两个参数?clean和一个闭包?这里就不对了,如果是两个参数,中间需要有,隔开,所以这里只有一个参数,就是clean。那这就是什么写法?这里我们又要了解groovy中的一个语法特性,

当一个方法的最后一个参数是闭包,可以将这个闭包写在()外面。

看例子:

def foo(String s,Closure cl){cl(s)
}//foo('hello world'){println it
}foo 'hello world',{println it
}

方法的两种特殊写法都在这了,上面讲个写法就是处的写法。

所以把clean理解为一个参数是对的,接着再看clean(type: Delete)这个就简单了,groovy中的方法参数是支持命名参数的,这里用的就是命名参数,到这里都理顺了,我们还是写一个小例子模仿一下上面的写法:

def task(String taskName){println 'execute task ' + taskName
}def clean(Map type,Closure cl){type.type
}def delete(String path){}Delete = 'delete'task clean(type:Delete){delete "path"}

这里我很勉强的写出了类似的代码,但gradle中的这些写法真的是我们理解的这样子吗?我们使用代码跟踪来看看.

首先看看dependencies是不是一个方法?

 void dependencies(Closure var1);

哈哈,还真是的,而且参数的确是一个闭包。

那在看看classpath是不是一个方法?

WTF,见鬼了,跟踪classpath的结果如下:

Dependency add(String configurationName, Object dependencyNotation);

竟然跟踪到了这个add方法,而且add方法还有两个参数,这是什么鬼?更诡异的是这个add方法属于DependencyHandler.java这个接口,对你没看错,是java接口。What the hell???

冷静一下。。。

我们分析一下,为什么会发生这种事情,这个难道已经超出我们认知的方位了?其实不然,虽然现在我也是啥都不知道,但我觉得这其中的原由一定能够在gradle中找到,所以就然我们正式开启学习gradle的大门吧。

本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1928050,如需转载请自行联系原作者

gradle风格的groovy代码相关推荐

  1. 写出gradle风格的groovy代码

    写出gradle风格的groovy代码 我们先来看一段gradle中的代码: buildscript {repositories {jcenter()}dependencies {classpath ...

  2. 【错误记录】Android Studio 中编写 Gradle 编译脚本时没有 Groovy 代码提示 ( Cannot find declaration to go to )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Android Studio 工程中 , 编辑 build.gradle 脚本时 , 无法进行代码提示 ; 按住 Ctrl 键 , 点击相应的属 ...

  3. 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )

    文章目录 一.创建 Groovy 代码文件 二.使用 Java 语法实现 Groovy 类和主函数并运行 三.按照 Groovy 语法改造上述 Java 语法规则代码 一.创建 Groovy 代码文件 ...

  4. Gradle中的buildScript代码块

    在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: build.gradle 1 2 3 4 5 6 7 8 9 buildScript { repositories ...

  5. Gradle详解+Groovy

    Gradle是当前非常"劲爆"的构建工具.本篇文章就是专为讲解Gradle而来.介绍Gradle之前,先说点题外话. 一.题外话 说实话,我在索尼工作的时候,就见过Gradle.但 ...

  6. Gradle入门之Groovy语法

    前言 gradle是一个基于JVM的构建工具,它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与Java代码很好地结合,也能用于扩展现有代码.由于其运行在 J ...

  7. Gradle详解(Groovy)

    为以免以后学习时丢失,特意转载,希望原作者见谅,转载务必请注明下面原作者链接. http://www.infoq.com/cn/articles/android-in-depth-gradle Gra ...

  8. Gradle中的buildScript代码块 - 黄博文

    原文链接:http://www.cnblogs.com/huang0925/p/3940528.html?utm_source=tuicool&utm_medium=referral 在编写G ...

  9. 使用Groovy代码执行本地操作系统命令的方法

    看个例子,我在Groovy项目文件夹所在目录执行dir,得到如下输出: 现在我希望用Groovy代码实现这个dir命令的执行效果,代码如下: def process = "cmd /c di ...

最新文章

  1. 特斯拉首次达成连续4季度盈利:车卖的少了,钱却挣得多了
  2. 【干货】史上最全的Tensorflow学习资源汇总,速藏!
  3. Arcgis Server 默认服务端口号修改方法
  4. Android Cursor自动更新的实现和原理
  5. 高并发分布式系统中生成全局唯一(订单号)Id
  6. 电子计算机信息工程都是做什么的,电子信息工程专业将来干什么 就业前景好不好...
  7. System.Configuration.ConfigurationSettings.GetConfig(string)”已过时 问题的解决方法
  8. rust tpa_Rust(腐蚀)怎么tp求大神指教。请写在下面
  9. NOIP2013D1T3货车运输(最大生成树+倍增lca)
  10. python爬虫10万信息mysql_python爬虫:爬取易迅网价格信息,并写入Mysql数据库
  11. eclipse新建tomcat server但是总是报404的解决方法
  12. MongoDB 凉了?
  13. HP FC MSA2000服务器raid数据恢复成功案例
  14. 一个可以模仿你的表情的语音聊天机器人——Facemoji 废萌(OpenCV+Dlib+Live2D+图灵机器人+讯飞IAT语音听写+讯飞TTS语音合成)
  15. Numpy的终极备忘录
  16. 【飞思卡尔】飞思卡尔摄像头算法基本方法
  17. SkyWalking--告警--使用/教程/示例
  18. 【vue2】05_动态组件 插槽 自定义指令
  19. P-Link ARM Cortex-M脱机编程器开源前的一些准备工作----第四章 几个重要的结构体介绍
  20. DES EBC模式前台加密JAVA后台解密

热门文章

  1. linux I/O--I/O多路复用--介绍(二)
  2. thinkphp 个别字段无法更新_Ripro子主题:jizhichlid极致主题,原创首发永久更新,不限域名永乐使用...
  3. eve模拟器_EVE-NG,不仅仅是一款网络模拟软件,更是虚拟仿真环境
  4. hashMap死循环
  5. C#获得父进程PID编号的完整源源码
  6. 数据科学家最常用的10种算法
  7. 在Centos 6.x 下yum安装php 5.5
  8. Esper 20章 优化
  9. Silverlight专题(WatermarkedTextBox使用)--摘录 很受用
  10. android跨进程读写内存,Android 跨进程内存泄露