简单实例,在工程的build.gradle文件中添加如下代码
class CustomParamsExtensions{
def happyDes = 'very happy'
def happyLevel = 3
}
class CustomParamsNestExtensions{
def dataParams = 'NestParam'
}
project.extensions.create("myParams", CustomParamsExtensions)
project.myParams.extensions.create("nestParams", CustomParamsNestExtensions)
project.afterEvaluate {
println("App project after evaluate")
println("the custom extensions happy des is " + project.myParams.happyDes)
println("the nest extensions dataParams is " + project.myParams.nestParams.dataParams)
}
执行 gradle 后输出
App project after evaluate
the custom extensions happy des is very happy
the nest extensions dataParams is NestParam
以上实例是扩展属性简单的使用,可以使用这种方式在Task中传递参数,以及定义project的一些属性
下面按自己理解简单分析为什么会是这样的方式?
Project.java
/**
* Allows adding DSL extensions to the project. Useful for plugin authors.
*
* @return Returned instance allows adding DSL extensions to the project
*/
ExtensionContainer getExtensions();
从代码上来看,project.extensions返回ExtensionContainer对象,
project.extensions.create("Name", ExtensionClass)创建 extension, 按后面的使用来看,创建extension后会将其加入到ExtensionContainer对象中
build.gradle文件中添加下列输出
println "project.extensions: " + project.extensions
println "project.myParams: " + project.myParams
println "project.myParams.extensions: " + project.myParams.extensions
得到的输出结果为
project.extensions: org.gradle.api.internal.plugins.DefaultConvention@7d43928e
project.myParams: CustomParamsExtensions_Decorated@3f32dea4
project.myParams.extensions: org.gradle.api.internal.plugins.DefaultConvention@5d1e3c5eyou
从输出结果来看,project.extensions 和 project.myParams.extensions 的类型为 DefaultConvention
创建时
project.myParams.extensions.create("nestParams", CustomParamsNestExtensions)
DefaultConvention中
public void add(String name, Object extension) {
if(extension instanceof Class) {
this.create(name, (Class)extension, new Object[0]);
} else {
this.extensionsStorage.add(name, extension);
}
}
public <T> T create(String name, Class<T> type, Object... constructionArguments) {
Object instance = this.getInstantiator().newInstance(type, constructionArguments);
this.add(name, instance);
return instance;
}
我们创建的extension会添加到
DefaultConvention的extensionsStorage中
简单实例中extensions的值为:
我们使用的dataParams时的调用方式
project.myParams.nestParams.dataParams
或使用
project.extensions['myParams']['nestParams']['dataParams']