写出gradle风格的groovy代码

写出gradle风格的groovy代码

我们先来看一段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代码的时候是懵逼的,

gsfdtrysrtsfdg.jpg

这是哪门子语言,这到底是类似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???

冷静一下。。。

cce4b48f8c5494ee7008eb9528f5e0fe98257eca.jpg

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

ad7fd688d43f879424026deed01b0ef41ad53a2e.jpg

转载于:https://www.cnblogs.com/zqlxtt/p/5741306.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA8后接口的新特性

知识点一: 知识点二: 知识点三: 知识点四: 知识点五:

input的type属性的修改

记录一下成长的历程吧! 刚开始写,没什么文笔,也没什么技术含量,可能主要的是纪录一下平常工作学习中遇到的问题,以及解决的办法吧。或者只有问题,没有解决办法。 前两天项目中遇到的一个问题,由…

程序 进程 线程

并行:再球场上,每个人都有篮球,都自己玩自己的 并发:只有一个球,一堆人玩 球(CPU) 人(线程) t1这个线程对象,是再主线程造的,以及执行t1.start…

ActiveMQ入门实例

1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。 启动ActiveMQ以后,登陆:http://localhost…

前端癖

https://github.com/whqet/Fed-Hobby 前端癖 前端癖,前端开发学习资源集散地,分享前端开发相关的学习资源。 欢迎大家加入QQ群前端癖(333278649)交流学习。 前端导航目录 大神国际国内团队国内团队资讯技术周刊技术社区技术博客灵感创意评奖案例交流资源…

Thread类的有关方法以及优先级

线程中的常用方法 线程的优先级: 线程优先级设置的高,只是说明CPU优先处理该线程的概率高,而不是先处理优先级高的

前端学习(2056):初识vue.js

MVVM模式 jquery.js <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&q…

什么是响应式网页

什么是响应式网页 2000: 塞班、黑莓&#xff0c;GPRS&#xff0c;2.5G&#xff0c;可以浏览WML网页 2008: iOS/Linux&#xff0c;3G&#xff0c;Safari&#xff0c;可以浏览HTML网页 Android/Linux&#xff0c;Chrome&#xff0c;可以浏览HTML网页 Responsive Web Page 响应式/…

HttpWebRequest类

HttpWebRequest类与HttpRequest类的区别。 HttpRequest类的对象用于服务器端&#xff0c;获取客户端传来的请求的信息&#xff0c;包括HTTP报文传送过来的所有信息。而HttpWebRequest用于客户端&#xff0c;拼接请求的HTTP报文并发送等。 HttpWebRequest这个类非常强大&#xf…

比较创建几种线程的方式

JDK5.0新增的创建多线程的方式&#xff1a; 新增一&#xff1a; //创建多线程的方式三&#xff1a;callabe;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;//1.创建一个Callable的实现类 c…