【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
生活随笔
收集整理的這篇文章主要介紹了
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、使用 ExpandoMetaClass 進行方法注入
- 三、完整代碼示例
一、使用 ExpandoMetaClass 進行方法注入
在 【Groovy】MOP 元對象協議與元編程 ( 方法注入 | 同時注入普通方法、靜態方法、構造方法 ) 博客中 , 使用 MetaClass 注入 普通方法、靜態方法、構造方法 , 其底層原理就是通過 ExpandoMetaClass 進行方法注入 ;
我們也可以自己手動實現 ExpandoMetaClass 方法注入過程 ;
如為下面的 Student 類注入方法 ;
class Student {def name; }首先 , 創建 ExpandoMetaClass 實例對象 ;
def expandoMetaClass = new ExpandoMetaClass(Student)然后 , 為其注入方法 , 可以注入 普通方法、靜態方法、構造方法 ;
// 為 expandoMetaClass 注入普通方法 expandoMetaClass.hello = {println "Hello ${delegate.name}" }// 為 expandoMetaClass 注入普通方法 expandoMetaClass.say = {println "My name is ${delegate.name}" }// 為 expandoMetaClass 注入靜態方法 expandoMetaClass.'static'.fun = {println "Class Type : ${delegate}" }再后 , 需要調用 ExpandoMetaClass 對象的 initialize 初始化方法 ;
// 初始化注入方法 expandoMetaClass.initialize()最后 , 使用初始化后的 ExpandoMetaClass 對象 , 為
// 替換 Student.metaClass Student.metaClass = expandoMetaClass這樣就手動的實現了 Student 類的方法注入 , 如果想要取消方法注入 , 將 Student.metaClass 置空 , 就回到了初始狀態 , 之后就無法調用注入的方法 ;
// 將 Student.metaClass 置空 , 又回到了初始狀態 // 之后就無法調用注入的方法 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 注入靜態方法 expandoMetaClass.'static'.fun = {println "Class Type : ${delegate}" }// 為 expandoMetaClass 注入構造方法 expandoMetaClass.constructor = {String str ->new Student(name: str) }// 初始化注入方法 expandoMetaClass.initialize()// 替換 Student.metaClass Student.metaClass = expandoMetaClassprintln Student.metaClass// 調用注入的靜態方法 Student.fun()// 使用注入的構造方法初始化 Student 類 def student = new Student("Tom")// 調用注入的普通方法 student.hello() student.say()// 將 Student.metaClass 置空 , 又回到了初始狀態 // 之后就無法調用注入的方法 Student.metaClass = null執行結果 :
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總結
以上是生活随笔為你收集整理的【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Groovy】MOP 元对象协议与元编
- 下一篇: 【Groovy】MOP 元对象协议与元编