Groovy Language

Gradle 系列

  1. Gradle - 简介
  2. Gradle - Groovy Language
  3. Gradle - DSL
  4. Gradle - Android Plugin DSL
  5. Gradle - 插件开发
  6. Gradle - 插件发布

简介

  • Groovy - 官方文档

Gradle 依赖于 Groovy,Groovy 同时本身是一种 DSL。所以学习 Gradle 之前我们先熟悉一下 Groovy 语言。

DSL 的全称是 Domain Specific Language,即领域特定语言,或者直接翻译成”特定领域的语言”,算了,再直接点,其实就是这个语言不通用,只能用于特定的某个领域,俗称“小语言”。因此 DSL 也是语言。

Groovy 程序运行时,首先被编译成 Java 字节码,然后通过 JVM 来执行。 Java, Groovy 和 JVM 之间的关系类似于下图:

实际上,由于 Groovy Code 在真正执行的时候,已经变成了 Java 字节码, 因此 JVM 根本不知道自己运行的是 Groovy 代码。

环境搭建

  • 配置 Java JDK

    Groovy 是依赖于 Java 的,所以首先要配置好 JDK。

  • 下载安装 Groovy

    http://groovy-lang.org/download.html

    下载完解压放在固定目录下。

  • 配置环境变量

    // 配置 Groovy 环境变量

    $ vim ~/.bash_profile

    export PATH=$PATH:/Users/<username>/Develop/groovy-2.4.15/bin
    

    // 重新加载配置文件,使配置生效

    $ source ~/.base_profile

    // 打印版本号

    $ groovy -v

    显示结果为:

    Groovy Version: 2.4.15 JVM: 9.0.1 Vendor: Oracle Corporation OS: Mac OS X
    
  • Hello World

    创建一个 hello.groovy 文件。

    $ vim hello.groovy

    输入代码:

    println "Hello Groovy!"
    

    保存并执行

    $ groovy hello.groovy

    输出结果为:

    Hello Groovy!
    

基本语法

默认情况下,Groovy 在代码中包括以下库,因此您不需要显式导入它们。

import java.lang.*
import java.util.*
import java.io.*
import java.net.* import groovy.lang.*
import groovy.util.* import java.math.BigInteger
import java.math.BigDecimal
  • 变量

    def variable = 1//不需要指定类型,不需要分号结尾
    def int x = 1//也可以指定类型
    
  • 函数

    //无需指定参数类型
    String test(arg1, arg2) {return "hello"
    }//返回值也可以无类型
    def test2(arg1, arg2) {return 1
    }def getResult() {"First Blood, Double Kill" // 如果这是最后一行代码,则返回类型为String1000 //如果这是最后一行代码,则返回类型为Integer
    }//函数调用,可以不加()
    test a,b
    test2 a,b
    getResult()
    

    调用函数要不要带括号,我个人意见是如果这个函数是 Groovy API 或者 Gradle API 中比较常用的,比如 println,就可以不带括号,否则还是带括号。

  • 字符串

    //单引号包裹的内容严格对应Java中的String,不对$符号进行转义
    def singleQuote='I am $ dolloar' //打印singleQuote时,输出I am $ dollardef x = 1
    def test = "I am $x" //打印test时,将输出I am 1
    
  • 容器类

    Groovy中的容器类主要有三种: List(链表)、Map(键-值表)及Range(范围)。

    //List
    // 元素默认为Object,因此可以存储任何类型
    def aList = [5, 'test', true]
    println aList.size  //结果为3
    println aList[2]  //输出true
    aList[10] = 8
    println aList.size // 在index=10的位置插入元素后,输出11,即自动增加了长度
    println aList[9] //输出null, 自动增加长度时,未赋值的索引存储null//添加as关键字,并指定类型
    def aList = [5, 'test', true] as int[]//Map
    def aMap = ['key1':1, "key2":'test', key3:true]//读取元素
    println aMap.key1    //结果为1
    println aMap.key2    //结果为test//注意这种使用方式,key不用加引号println aMap['key2'] //结果为test//插入元素
    aMap['key3'] = false
    println aMap         //结果为[key1:1, key2:test, key3:false] //注意用[]持有key时,必须加引号aMap.key4 = 'fun'    //Map也支持自动扩充
    println aMap         //结果为[key1:1, key2:test, key3:false, key4:fun]//Range
    def aRange = 1..5
    println aRange       // [1, 2, 3, 4, 5]aRange = 1..<6
    println aRange       // [1, 2, 3, 4, 5]println aRange.from  // 1
    println aRange.to    // 5println aRange[0]    //输出1
    aRange[0] = 2        //抛出java.lang.UnsupportedOperationException
    
  • 闭包

    //同样用def定义一个闭包
    def aClosure = {//代码为具体执行时的代码println 'this is closure'
    }//像函数一样调用,无参数
    aClosure() //将执行闭包中的代码,即输出'this is closure'//下面这种写法也可以
    //aClosure.call()
    
  • Groovy 可以像 Java 那样定义类,例如:

    package com.jeanboy.groovyclass Test {String mNameString mTitleTest(name, title) {mName = namemTitle = title}def print() {println mName + ' ' + mTitle}
    }
    

    与 Java 不同的是,如果不声明 public/private 等访问权限, Groovy 中定义类的方法及成员变量均默认是 public 的。

    与 Java 一样,其它文件如果需要使用这个类时, 需要使用 import 关键字导入。

    例如,在 Test 类的根目录下创建一个测试文件 test.groovy 时, 可以这么使用 Test.groovy:

    import com.jeanboy.groovy.Testdef test = new Test('superman', 'hero')
    test.print()
    
  • 文件

    def targetFile = new File("/home/jeanboy/Desktop/file.txt")
    //读文件的每一行
    targetFile.eachLine { String oneLine ->println oneLine
    }
    def bytes = targetFile.getBytes()//返回文件对应的 byte()
    

其他系列

  • Android 屏幕适配全攻略
  • Windows 环境下载 Android 源码
  • Android 性能优化-UI优化
  • Android 性能优化-内存优化
  • Java 虚拟机内存分配机制
  • Java 虚拟机垃圾回收机制
  • 一篇文章看明白 TCP/IP,TCP,UDP,IP,Socket 之间的关系
  • 一篇文章看明白 HTTP,HTTPS,SSL/TSL 之间的关系
  • 一篇文章看明白 Android 系统启动时都干了什么
  • 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
  • 一篇文章看明白 Android 从点击应用图标到界面显示的过程
  • 一篇文章看明白 Activity 与 Window 与 View 之间的关系
  • 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
  • 一篇文章看明白 Android Service 启动过程
  • 一篇文章看明白 Android PackageManagerService 工作流程
  • 一篇文章看明白 Android v1 & v2 签名机制

更多文章:

这是我博客长期更新的项目,欢迎大家 Star。
https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode

我的公众号

欢迎你「扫一扫」下面的二维码,关注我的公众号,可以接受最新的文章推送,有丰厚的抽奖活动和福利等着你哦!?

如果你有什么疑问或者问题,可以 点击这里 提交 issue,也可以发邮件给我 jeanboy@foxmail.com。

同时欢迎你 来一起交流学习,群里有很多大牛和学习资料,相信一定能帮助到你!

Gradle - Groovy Language相关推荐

  1. Gradle Groovy 基础语法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Gradle Groovy 快速入门

    要构建一个 Groovy 项目,你需要使用 Groovy 插件.该插件扩展了 Java 插件,对你的项目增加了 Groovy 的编译功能. 你的项目可以包含 Groovy 源码,Java 源码,或者两 ...

  3. gradle groovy

    groovy语法: 一.基本使用 类型定义 //可选的类型定义 类型自动推导 def age = 10 def name = "城南一霸贾十七" assert age == 11 ...

  4. 一篇文章看明白 Android PackageManagerService 工作流程

    Android - PackageMangerService 分析 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 ...

  5. 一篇文章看明白 Android v1 v2 签名机制

    Android - v1 & v2 签名机制 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文章看明 ...

  6. 转载:一篇文章看明白 Android 系统启动时都干了什么

    最近在看<深入理解Android内核设计思想>,老实说,作为教材,这本书实在写的不好.本来内核的东西就比应用层繁杂,需要有个条绳子牵着,有个框子框着才不好跟丢.这个书老是在章节开头抛出一些 ...

  7. 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系

    Android - SurfaceFlinger 图形系统 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文 ...

  8. Android-性能优化-UI优化

    Android-性能优化-UI优化 相关系列 Android 性能优化-UI优化 Android 性能优化-内存优化 概述 Android 应用的卡顿,丢帧等,这些影响用户体验的因素绝大部分都与 16 ...

  9. 一篇文章看明白 Android Service 启动过程

    Android - Service 启动过程 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文章看明白 An ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化四级编程题:排序
  2. 小视频开发过程中最关注的两点关键
  3. 计算1至1000间的合数c语言,输出1000以内的素数的算法(实例代码)
  4. mysql strstr_实现 strStr() 函数-算法刷题
  5. pip 安装 imagecodecs 失败
  6. 计算机网络之应用层:5、万维网、http协议
  7. linux 每日学一点《linux中让NMAP命令跟防火墙躲猫猫》
  8. tp读取配置文件机制
  9. java delete()_Java File delete()用法及代码示例
  10. IBM Tivoli NetView网管软件实战
  11. Java Stream流总结
  12. js中for(i in array)和for(i=0;i<array.length;i++)之间的坑
  13. 拉格朗日乘子法、KKT条件、拉格朗日对偶性
  14. Linux 魔法系统请求键骇客
  15. textpad:工具中没有编译
  16. 国外酷站设计:15个带给你灵感的作品集网站
  17. win8服务器设置虚拟机,win8系统怎么安装虚拟机 win8系统安装虚拟机的详细图文教程...
  18. python机器学习及实践_机器学习入门之《Python机器学习及实践:从零开始通往Kaggle竞赛之路》...
  19. html里的标签的概念,HTML相关概念的介绍及HTML5结构和标签
  20. ゞAndroid - 毞記 - xxxxxxxxxゞ

热门文章

  1. 解决联想拯救者Y7000安装ubuntu系统wifi无法连接以及关机卡死问题
  2. div高度设置100%无效的问题 (亲身实践)
  3. PostgreSQL 一复合查询SQL优化例子 - (多个exists , 范围检索 , IN检索 , 模糊检索 组合)...
  4. 什么叫单模光纤_酒店工程之监控安防工程光纤如何使用
  5. 《袁老师访谈录》第一期|吴恩柏教授/香港科大协理副校长:【成功,说到底要非常专注!】...
  6. 实战案例!用 Python 绘制全国鸿星尔克门店分布图,最多的是你所在城市吗?
  7. HTML5期末大作业:在线电影网站设计——我不是药神电影介绍(4页) HTML+CSS+JavaScript 大二实训大作业HTML源码
  8. web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}...
  9. Win7系统安装Pycharm专业版
  10. 处理win10系统自动休眠bug