class AGroovyClass {}objA = new AGroovyClass() // 实例对象AobjB = new AGroovyClass() // 实例对象Bemc = new ExpandoMetaClass(AGroovyClass)emc.add = {val1, val2 -> val1 + val2}emc.initialize()objA.metaClass = emc // 向A注入方法PRintln objA.add(11, 13)try { objB.add(11, 13) // B中未注入方法,报错} catch (ex) { println "error"}返回24error2、直接使用metaClass,添加方法。class AGroovyClass {}objA = new AGroovyClass() // 实例对象AobjB = new AGroovyClass() // 实例对象BobjA.metaClass.add = {val1, val2 -> val1 + val2 }println objA.add(11, 13)try { objB.add(11, 13) // B中未注入方法,报错} catch (ex) { println "error"}3、metaClass分组。class AGroovyClass {}obj = new AGroovyClass()obj.metaClass { add = { -> "In add function" } del = { -> "In del function" }}println obj.add() // In add functionprintln obj.del() // In del function4、设置metaClass为null时,仅仅会影响metaClass中添加的方法,类方法不受影响。class AGroovyClass { def add() { "In add function" }}obj = new AGroovyClass()obj.metaClass { del = { -> "In del function" }}println obj.del() // In del functionobj.metaClass = nullprintln obj.add() // In add functiontry { println obj.del()} catch(ex) { println "error" // error}返回In del functionIn add functionerror
新闻热点
疑难解答