【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
文章目錄
- 一、使用 ExpandoMetaClass 進(jìn)行方法注入
- 三、完整代碼示例
一、使用 ExpandoMetaClass 進(jìn)行方法注入
在 【Groovy】MOP 元對(duì)象協(xié)議與元編程 ( 方法注入 | 同時(shí)注入普通方法、靜態(tài)方法、構(gòu)造方法 ) 博客中 , 使用 MetaClass 注入 普通方法、靜態(tài)方法、構(gòu)造方法 , 其底層原理就是通過 ExpandoMetaClass 進(jìn)行方法注入 ;
我們也可以自己手動(dòng)實(shí)現(xiàn) ExpandoMetaClass 方法注入過程 ;
如為下面的 Student 類注入方法 ;
class Student {def name; }首先 , 創(chuàng)建 ExpandoMetaClass 實(shí)例對(duì)象 ;
def expandoMetaClass = new ExpandoMetaClass(Student)然后 , 為其注入方法 , 可以注入 普通方法、靜態(tài)方法、構(gòu)造方法 ;
// 為 expandoMetaClass 注入普通方法 expandoMetaClass.hello = {println "Hello ${delegate.name}" }// 為 expandoMetaClass 注入普通方法 expandoMetaClass.say = {println "My name is ${delegate.name}" }// 為 expandoMetaClass 注入靜態(tài)方法 expandoMetaClass.'static'.fun = {println "Class Type : ${delegate}" }再后 , 需要調(diào)用 ExpandoMetaClass 對(duì)象的 initialize 初始化方法 ;
// 初始化注入方法 expandoMetaClass.initialize()最后 , 使用初始化后的 ExpandoMetaClass 對(duì)象 , 為
// 替換 Student.metaClass Student.metaClass = expandoMetaClass這樣就手動(dòng)的實(shí)現(xiàn)了 Student 類的方法注入 , 如果想要取消方法注入 , 將 Student.metaClass 置空 , 就回到了初始狀態(tài) , 之后就無法調(diào)用注入的方法 ;
// 將 Student.metaClass 置空 , 又回到了初始狀態(tài) // 之后就無法調(diào)用注入的方法 Student.metaClass = null三、完整代碼示例
完整代碼示例 :
class Student {def name; }println Student.metaClass// 使用 ExpandoMetaClass 注入方法 def expandoMetaClass = new ExpandoMetaClass(Student)// 為 expandoMetaClass 注入普通方法 expandoMetaClass.hello = {println "Hello ${delegate.name}" }// 為 expandoMetaClass 注入普通方法 expandoMetaClass.say = {println "My name is ${delegate.name}" }// 為 expandoMetaClass 注入靜態(tài)方法 expandoMetaClass.'static'.fun = {println "Class Type : ${delegate}" }// 為 expandoMetaClass 注入構(gòu)造方法 expandoMetaClass.constructor = {String str ->new Student(name: str) }// 初始化注入方法 expandoMetaClass.initialize()// 替換 Student.metaClass Student.metaClass = expandoMetaClassprintln Student.metaClass// 調(diào)用注入的靜態(tài)方法 Student.fun()// 使用注入的構(gòu)造方法初始化 Student 類 def student = new Student("Tom")// 調(diào)用注入的普通方法 student.hello() student.say()// 將 Student.metaClass 置空 , 又回到了初始狀態(tài) // 之后就無法調(diào)用注入的方法 Student.metaClass = null執(zhí)行結(jié)果 :
org.codehaus.groovy.runtime.HandleMetaClass@45dd4eda[groovy.lang.MetaClassImpl@45dd4eda[class Student]] groovy.lang.ExpandoMetaClass@670002[class Student] Class Type : class Student Hello Tom My name is Tom總結(jié)
以上是生活随笔為你收集整理的【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Groovy】MOP 元对象协议与元编
- 下一篇: 【错误记录】IntelliJ IDEA