You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
3.5 KiB
203 lines
3.5 KiB
5 years ago
|
---
|
||
|
Extension
|
||
|
---
|
||
|
|
||
|
#### 目录
|
||
|
|
||
|
1. 简单 Extension
|
||
|
2. 嵌套 Extension
|
||
|
3. 嵌套容器 Extension
|
||
|
|
||
|
#### 简单 Extension
|
||
|
|
||
|
```
|
||
|
student {
|
||
|
name 'Omooo'
|
||
|
age 18
|
||
|
isMale false
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
class Student {
|
||
|
String name
|
||
|
int age
|
||
|
boolean isMale
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
project.extensions.create('student', Student.class)
|
||
|
Student student = project.extensions.getByType(Student.class)
|
||
|
println(student.name)
|
||
|
```
|
||
|
|
||
|
#### 嵌套 Extension
|
||
|
|
||
|
```
|
||
|
student {
|
||
|
name 'Omooo'
|
||
|
age 18
|
||
|
isMale false
|
||
|
|
||
|
info {
|
||
|
qq 2333
|
||
|
email '2333@qq.com'
|
||
|
isDog true
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
class Student {
|
||
|
String name
|
||
|
int age
|
||
|
boolean isMale
|
||
|
Info info
|
||
|
|
||
|
@SuppressWarnings("UnstableApiUsage")
|
||
|
Student(ObjectFactory factory) {
|
||
|
info = factory.newInstance(Info.class)
|
||
|
}
|
||
|
|
||
|
def info(Action<Info> action) {
|
||
|
action.execute(info)
|
||
|
}
|
||
|
|
||
|
|
||
|
static class Info {
|
||
|
String email
|
||
|
int qq
|
||
|
boolean isDog
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
project.extensions.create('student', Student.class, project.objects)
|
||
|
Student student = project.extensions.getByType(Student.class)
|
||
|
println(student.name)
|
||
|
println(student.info.qq)
|
||
|
```
|
||
|
|
||
|
#### 嵌套容器 Extension
|
||
|
|
||
|
```
|
||
|
animal {
|
||
|
count 2333
|
||
|
|
||
|
dog {
|
||
|
form 'Animal'
|
||
|
isMale false
|
||
|
}
|
||
|
|
||
|
catConfig {
|
||
|
shanghaiCat {
|
||
|
from 'Shanghai'
|
||
|
weight 20000.0f
|
||
|
}
|
||
|
|
||
|
beijingCat {
|
||
|
from 'Beijing'
|
||
|
weight 300f
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
class Dog {
|
||
|
String form
|
||
|
boolean isMale
|
||
|
|
||
|
@Override
|
||
|
String toString() {
|
||
|
return "Dog{" +
|
||
|
"form='" + form + '\'' +
|
||
|
", isMale=" + isMale +
|
||
|
'}'
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
class Cat {
|
||
|
String name
|
||
|
|
||
|
String from
|
||
|
float weight
|
||
|
|
||
|
Cat(String name) {
|
||
|
this.name = name
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
String toString() {
|
||
|
return "Cat{" +
|
||
|
"name='" + name + '\'' +
|
||
|
", from='" + from + '\'' +
|
||
|
", weight=" + weight +
|
||
|
'}'
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
class CatExtFactory implements NamedDomainObjectFactory<Cat> {
|
||
|
|
||
|
private Instantiator instantiator
|
||
|
|
||
|
CatExtFactory(Instantiator instantiator1) {
|
||
|
this.instantiator = instantiator1
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
Cat create(String s) {
|
||
|
return instantiator.newInstance(Cat.class, s)
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
class Animal {
|
||
|
int count
|
||
|
Dog dog
|
||
|
private NamedDomainObjectContainer<Cat> catContainer
|
||
|
|
||
|
Animal(Instantiator instantiator,
|
||
|
NamedDomainObjectContainer<Cat> catContainer) {
|
||
|
this.dog = instantiator.newInstance(Dog.class)
|
||
|
this.catContainer = catContainer
|
||
|
}
|
||
|
|
||
|
void dog(Action<Dog> action) {
|
||
|
action.execute(dog)
|
||
|
}
|
||
|
|
||
|
void catConfig(Action<? extends NamedDomainObjectContainer<Cat>> action) {
|
||
|
action.execute(catContainer)
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
String toString() {
|
||
|
return "dog info:" + dog.toString() + "\ncat info:" + catContainer
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```groovy
|
||
|
Instantiator instantiator = ((DefaultGradle) project.getGradle())
|
||
|
.getServices().get(Instantiator.class)
|
||
|
NamedDomainObjectContainer<Cat> catContainer =
|
||
|
project.container(Cat.class, new CatExtFactory(instantiator))
|
||
|
project.extensions.create('animal', Animal.class, instantiator, catContainer)
|
||
|
|
||
|
project.task('showAnimalInfo'){
|
||
|
doLast{
|
||
|
Animal animal = project.extensions.getByName('animal')
|
||
|
println(animal.toString())
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|