一、Expando 动态类简介
Groovy 运行时 , 可以动态地创建一个类 , 该类称为 " 动态类 " ;
这个类运行前并不存在 , 没有通过 class 定义该类 , 而是在 运行时通过代码创建的 ;
Groovy 提供了一个 groovy.util.Expando 类 , 该类专门用于创建 " 动态类 " ;
Expando 动态类原型如下 :
package groovy.util; /** * 表示一个动态可扩展的bean。 */ public class Expando extends GroovyObjectSupport { // 动态类 属性 , 封装在该映射集合 Map 中 private Map expandoProperties; public Expando() { } public Expando(Map expandoProperties) { this.expandoProperties = expandoProperties; } }
二、动态类创建
Expando 构造函数可以接受键值对作为参数 ,
public class Expando extends GroovyObjectSupport { // 动态类 属性 , 封装在该映射集合 Map 中 private Map expandoProperties; public Expando(Map expandoProperties) { this.expandoProperties = expandoProperties; } }
如果要在动态类中设置 name 属性 , 在构造函数中传入
name: "Tom",
参数即可 , 如果为动态类设置 hello 方法 , 在构造函数中传入
hello: { println "Hello!" }
参数 ;
代码示例 :
// 创建动态类 def student = new Expando( // 动态类属性 name: "Tom", // 动态类成员方法 hello: { println "Hello!" } )
三、为动态类增加字段和方法
在动态类创建完毕之后 , 使用
动态类.属性名 = 属性值
的方式 , 为动态类增加属性 ,
// 为动态类增加属性 student.age = 18
使用
动态类.方法名 = {闭包}
的方式 , 为动态类增加方法 ;
// 为动态类增加方法 student.hello2 = { println "Hello2!!" }
代码示例 :
// 创建动态类 def student = new Expando( // 动态类属性 name: "Tom", // 动态类成员方法 hello: { println "Hello!" } ) // 为动态类增加属性 student.age = 18 // 为动态类增加方法 student.hello2 = { println "Hello2!!" }
四、完整代码示例
完整代码示例 :
// 创建动态类 def student = new Expando( // 动态类属性 name: "Tom", // 动态类成员方法 hello: { println "Hello!" } ) // 为动态类增加属性 student.age = 18 // 为动态类增加方法 student.hello2 = { println "Hello2!!" } // 打印动态类字段 println student.name println student.age // 调用动态类方法 student.hello() student.hello2()
执行结果 :
Tom 18 Hello! Hello2!!