Gradle - Groovy Language
Groovy Language
Gradle 系列
- Gradle - 简介
- Gradle - Groovy Language
- Gradle - DSL
- Gradle - Android Plugin DSL
- Gradle - 插件开发
- 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相关推荐
- Gradle Groovy 基础语法 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Gradle Groovy 快速入门
要构建一个 Groovy 项目,你需要使用 Groovy 插件.该插件扩展了 Java 插件,对你的项目增加了 Groovy 的编译功能. 你的项目可以包含 Groovy 源码,Java 源码,或者两 ...
- gradle groovy
groovy语法: 一.基本使用 类型定义 //可选的类型定义 类型自动推导 def age = 10 def name = "城南一霸贾十七" assert age == 11 ...
- 一篇文章看明白 Android PackageManagerService 工作流程
Android - PackageMangerService 分析 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 ...
- 一篇文章看明白 Android v1 v2 签名机制
Android - v1 & v2 签名机制 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文章看明 ...
- 转载:一篇文章看明白 Android 系统启动时都干了什么
最近在看<深入理解Android内核设计思想>,老实说,作为教材,这本书实在写的不好.本来内核的东西就比应用层繁杂,需要有个条绳子牵着,有个框子框着才不好跟丢.这个书老是在章节开头抛出一些 ...
- 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
Android - SurfaceFlinger 图形系统 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文 ...
- Android-性能优化-UI优化
Android-性能优化-UI优化 相关系列 Android 性能优化-UI优化 Android 性能优化-内存优化 概述 Android 应用的卡顿,丢帧等,这些影响用户体验的因素绝大部分都与 16 ...
- 一篇文章看明白 Android Service 启动过程
Android - Service 启动过程 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文章看明白 An ...
最新文章
- 中国电子学会青少年编程能力等级测试图形化四级编程题:排序
- 小视频开发过程中最关注的两点关键
- 计算1至1000间的合数c语言,输出1000以内的素数的算法(实例代码)
- mysql strstr_实现 strStr() 函数-算法刷题
- pip 安装 imagecodecs 失败
- 计算机网络之应用层:5、万维网、http协议
- linux 每日学一点《linux中让NMAP命令跟防火墙躲猫猫》
- tp读取配置文件机制
- java delete()_Java File delete()用法及代码示例
- IBM Tivoli NetView网管软件实战
- Java Stream流总结
- js中for(i in array)和for(i=0;i<array.length;i++)之间的坑
- 拉格朗日乘子法、KKT条件、拉格朗日对偶性
- Linux 魔法系统请求键骇客
- textpad:工具中没有编译
- 国外酷站设计:15个带给你灵感的作品集网站
- win8服务器设置虚拟机,win8系统怎么安装虚拟机 win8系统安装虚拟机的详细图文教程...
- python机器学习及实践_机器学习入门之《Python机器学习及实践:从零开始通往Kaggle竞赛之路》...
- html里的标签的概念,HTML相关概念的介绍及HTML5结构和标签
- ゞAndroid - 毞記 - xxxxxxxxxゞ
热门文章
- 解决联想拯救者Y7000安装ubuntu系统wifi无法连接以及关机卡死问题
- div高度设置100%无效的问题 (亲身实践)
- PostgreSQL 一复合查询SQL优化例子 - (多个exists , 范围检索 , IN检索 , 模糊检索 组合)...
- 什么叫单模光纤_酒店工程之监控安防工程光纤如何使用
- 《袁老师访谈录》第一期|吴恩柏教授/香港科大协理副校长:【成功,说到底要非常专注!】...
- 实战案例!用 Python 绘制全国鸿星尔克门店分布图,最多的是你所在城市吗?
- HTML5期末大作业:在线电影网站设计——我不是药神电影介绍(4页) HTML+CSS+JavaScript 大二实训大作业HTML源码
- web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}...
- Win7系统安装Pycharm专业版
- 处理win10系统自动休眠bug