Groovy

groovy 面向对象

优势

灵活性上

粒度性上
Tinker就是动态修改打包APk的打包过程,修改补丁文件.

  • 复用性上

  • 兼容性上

**生命周期**:

Gradle组成
1.groovy核心语法
2.build script block


单引号定义的字符串

  1. 字符串一个引号和三个引号
    //能够实现换行的功能
    '''line one line two line three'''
    2 双引号定义的字符串
    但是他叫做可扩展的字符串(在整个字符串中定义可以扩展的内容)
    扩展之后的数据类型是 runtime.GStringImpl

//闭包的用法(用来进行一系列的骚操作)
//字符串和闭包结合
1 与基本数据类型的结合使用
2 与String 结合使用
3 与数据结构结合使用
4 与文件等结合使用

//闭包的几个关键字
//this 最外层的类
//当出现闭包嵌套的情况的时候
//owner指向的是最近的闭包中的对象
//当修改了闭包的delegate的时候 闭包就不一样了

//groovy委托
GroovyDelegate
将方法的实现进行委托

//DataStructureStudy 列表学习
groovy 列表轻易
主要讲述的是闭包结合当前的List集合 进 行一系列诸如
查找,查找集合等操作

DataStructureStudy
//数据结构 1.列表 2.映射 3.范围

GroovyRange 范围


面向对象
Trait类型
类似空适配器的模式
比如动画 我们需要的是其中的一个方法,但是我们只需要关心我们需要的方法即可,
这样的话就只需要关心我们需要的方法即可.

Groovy元编程

Groovy运行时期的各种方法
在错误的时候就会尝试调用这些方法

invokeMethod() 方法,当我们找不到方法的时候就可以调用这个方法
methodMissing()->invokeMethod()

为类动态的添加一个属性
metaClass 运行时期添加一般的属性,方法或者是静态的方法或者属性
ADV: 扩展第三方库的方法,达到变相添加的功能,那么通过metaClass就可以动态的注入方法或者属性

//通过闭包添加静态方法
Person.metaClass.static.createPerson = {
String name,int age ->new Person(name:name,age:age)
}

def ppp = Person.createPerson("xxx",222)
println ppp.name + ppp.age

!那么来源是哪里呢,是顶层的接口,GroovyObejct

我们通过setMetaClass或者setProperty方法进行方法或者属性的添加

public interface GroovyObject {
Object invokeMethod(String var1, Object var2);

Object getProperty(String var1);

void setProperty(String var1, Object var2);

MetaClass getMetaClass();

void setMetaClass(MetaClass var1);

}

但是!!! 这种注入是一次性的注入的,不是全局的Global注入.
查看PersonManager 完成了该类的方法的注入

整体语法总结
变量,字符串,数据结构

Project API 组成部分

  • project api
  • task api
  • 属性相关api
  • file相关api
  • gradle生命周期api
  • 其他api

BaseExtension 里面有各种可配置的属性

Gradle配置
Manipulation tasks(操作符task)

Project相当于入口
task任务的具体执行

java 变体Task


Gradle构建的程序有自己所需要的依赖
比如
1.本身的依赖
classpath 'com.android.tools.gradle.2.2.2' 这样才能指定为android程序

  1. 应用程序中所需要的依赖
    classpath 'com.tinker' 这是依赖第三方库的场景下的依赖
buildscript {
    //配置我们的插件依赖
    dependencies {
        //这是依赖文件数 freeTree代表的是文件数
        compile fileTree(include: ['*jar'],dir: 'libs')
        //这是对于第三方库的依赖
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    }
}


依赖冲突的问题
//排除依赖 && 禁止依赖的传递
compile(rootProject.ext.dependence.libAutoScrollViewPager) {
exclude module: 'support-v4' //排除依赖
transitive false //禁止传递依赖
}

provided: 何时代替compile

  1. 只会参与编译的场景,比如我们Tinker的application只会在编译阶段生成,但是不会参与Apk的打包.
  2. 主工程和其他工程都有相同的比如okhttp的库,那么真正参与打包的只会是主工程的okhttp库类.

doLast保证的是在执行阶段去执行

关于Gradle的返回值
def nonReturnTypeFunc(){
last_line //最后一行代码的执行结果就是本函数的返回值,可以有return,但是我们一般不会去写
}

你可能感兴趣的:(Groovy)