//分類注入 //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/")