日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/6/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 进行方法注入 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。