Groovy方法注入

//分類注入
//1
class Req{
    static def get(String self){
        self.toURL().text
    }
}
use(Req){
    println "https://www.baidu.com/".get()
}
//2
@groovy.lang.Category(String)
class StringUtil{
    def get(){
       toURL().text
    }
}
//加載順序右後到先 StringUtil-Req-本身的方法
use(Req,StringUtil){
    println "https://www.baidu.com/".get()

}

//直接給類注入方法
String.metaClass.get = {
    delegate.toString().toURL().text
}
println "https://www.baidu.com/".get()

//給類注入靜態方法
def str = "https://www.baidu.com/"
String.metaClass.'static'.printClass = {
    println delegate
}
String.printClass()

//注入構造函數
String.metaClass.constructor = {
    Calendar calendar->
        new String(calendar.getTime().toString())
}
println new String(Calendar.instance)

//多方法一起注入
String.metaClass{
    get = {
        delegate.toString().toURL().text
    }

    'static'{
        printlnClass = {
            println delegate
        }
    }

    constructor = {
        Calendar calendar->
            new String(calendar.getTime().toString())
    }
}

//另一種寫法
def emc = new ExpandoMetaClass(String)
emc.get = {
    delegate.toString().toURL().text
}
emc.initialize()
String.metaClass = emc
println str.get()
println String.metaClass //groovy.lang.ExpandoMetaClass
//制空 回到最開始 就調用不到get方法了
String.metaClass = null
println String.metaClass // groovy.runtime.HandleMetaClass

//混合方法注入
class Get{
    def get(String url){
        url.toString().toURL().text
    }
}
//String.mixin(Get)
String.metaClass.mixin(Get)
println "".get("https://www.baidu.com/")


發佈了57 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章