--- 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 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 { 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 catContainer Animal(Instantiator instantiator, NamedDomainObjectContainer catContainer) { this.dog = instantiator.newInstance(Dog.class) this.catContainer = catContainer } void dog(Action action) { action.execute(dog) } void catConfig(Action> 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 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()) } } ```