configurations配置
configurations {
wzp_imp.extendsFrom(implementation)//wzp_imp 可以是任何名称 继承 implementation配置
}
dependencies {
wzp_imp "androidx.appcompat:appcompat:1.4.2" //使用自定义配置 wzp_imp添加依赖项
}
//使用自定义配置处理一些问题
//将wzp_imp添加的依赖复制到 toPath目录下
task mySelfConfigTask {
def toPath = projectDir.absolutePath + "/lai"
configurations.wzp_imp.files.forEach({item->
copy {
from(item.absolutePath)
into(toPath)
}
})
}
//模仿 configurations 语法自己实现 配置方式一
class DomObj {
String name//必须添加 name字段
String msg
DomObj(String name) {
this.name = name
}
void msg(String msg) {
this.msg = msg
}
@Override
String toString() {
return "name = ${name},msg = ${msg}"
}
}
//扩展类
class WzpExtension {
//创建NamedDomainObjectContainer容器
NamedDomainObjectContainer<DomObj> wzpCon
WzpExtension(Project project) {
wzpCon = project.container(DomObj)//获取容器
}
void appConfig(Action<NamedDomainObjectContainer<DomObj>> action) {
action.execute(wzpCon)// 执行 action
}
void test() {
wzpCon.all {
println it
}
}
}
//添加一个扩展到项目里,
getExtensions().create("myExt", WzpExtension, project)
//使用扩展
myExt {
//执行WzpExtension里的appConfig方法
appConfig {
//生成 DomObj name属性的值name1 ,msg属性的值为 msg1
name1 {
msg "msg1"
}
//生成 DomObj name属性的值name2 ,msg属性的值为 msg2
name2 {
msg "msg2"
}
}
//此时WzpExtension里的wzpCon 里包含了 两个DomObj
test()
}
//模仿 configurations 语法自己实现 配置方式二
class MyBing {
def name = ""
def msg = ""
def msg(String arg) {
msg = arg
}
}
class MyDemo {
List<MyBing> ali = new ArrayList<>()
//调用不存在的方法时候会调用这个方法
@Override
Object invokeMethod(String methodName, Object bils) {
//创建一个 MyBing
MyBing myBing = new MyBing()
myBing.name = methodName
//绑定 闭包代理
Closure bi = bils[0]//获取方法的第一个参数,可以有多个参数
bi.delegate = myBing;
bi.setResolveStrategy(Closure.DELEGATE_FIRST)//设置代理策略
bi.call()执行闭包方法
ali.push(myBing)
return null
}
void test() {
ali.each {
println "name:${it.name},msg:${it.msg}"
}
}
}
task testMyExt {
MyDemo myDemo = new MyDemo()
Closure myCus = {
//MyDemo里的不存在name1方法所以会自动调用invokeMethod方法。
name1
{
msg "msg1"
}
name2
{
msg "msg2"
}
}
//绑定闭包代理
myCus.delegate = myDemo
myCus.setResolveStrategy(Closure.DELEGATE_FIRST)
myCus()
myDemo.test()
}