文章目录

  • 一、Expando 动态类简介
  • 二、动态类创建
  • 三、为动态类增加字段和方法
  • 四、完整代码示例

一、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!!

【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )相关推荐

  1. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

    文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...

  2. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )

    文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...

  3. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )

    文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...

  4. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )

    文章目录 一.使用 Category 分类进行方法注入的优点 二.使用 Category 分类进行方法注入的缺点 一.使用 Category 分类进行方法注入的优点 之前的博客 [Groovy]MOP ...

  5. 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )

    文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...

  6. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )

    文章目录 一.同时注入普通方法.静态方法.构造方法 二.完整代码示例 一.同时注入普通方法.静态方法.构造方法 如果要同时为 Groovy 类注入大量方法 , 使用 Category 分类 或 Met ...

  7. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )

    文章目录 一.分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 二.完整代码示例 一.分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 打印下面 ...

  8. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Mixin 混合进行方法注入 )

    文章目录 一.使用 Mixin 混合进行方法注入 二.完整代码示例 一.使用 Mixin 混合进行方法注入 使用 Mixin 混合进行方法注入 , 为下面的 Student 类注入方法 ; class ...

  9. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )

    文章目录 一.使用 MetaClass 注入静态方法 二.完整代码示例 一.使用 MetaClass 注入静态方法 使用 MetaClass 注入静态方法 , 可以使用如下代码实现 : 类名.meta ...

最新文章

  1. 威纶通触摸屏与单片机MODBUS_威纶通案例集锦51-55
  2. shell的嵌入命令大全
  3. 《HeadFirst设计模式》笔记
  4. windows dos 常用命令
  5. ERROR: Command errored out with exit status 1:
  6. 织梦cms生成首页html的php文件,织梦DedeCMS定时自动生成首页HTML的实现方法
  7. JDK 18 / Java 18 GA 发布
  8. leetcode —— 75. 颜色分类
  9. mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明
  10. c语言线性顺序表,C语言程序——线性顺序表.doc
  11. IIS和tomcat共用80端口
  12. Debian 中使用apt-get update 出现NO_PUBKEY 解决方法
  13. 局域网计算机加密共享文件,局域网共享文件,小编教你局域网共享文件怎么加密...
  14. 分析11年21部漫威电影,一览导演、主演、口碑票房最佳......
  15. Android武林大会(转)
  16. html格式错误检测,HTML格式错误
  17. python .npy 存取 dict
  18. C# winform 打印预览
  19. woo语言一行代码批量修改文件名称
  20. 利用js制作一个简单的QQ农场小游戏

热门文章

  1. 十大互联网公司都在寻找她!她是什么样的?
  2. 进程内COM与进程外COM
  3. zoj 2709 Lottery 组合数,概率,贪心 (8-F)
  4. MIDlet 移动开发
  5. 在Struts 2中实现文件上传
  6. 尚学堂requireJs课程---2、模块
  7. poj1018 Communication System (有道翻译完全拯救不了)
  8. OpenCV-自定义harris检测
  9. luogu P1064 金明的预算方案
  10. web移动端全屏滚动页面的适配问题