//可以从从Class层面来设定MetaClass,示例如下:
public class MyMetaClass extends DelegatingMetaClass{
MyMetaClass(Class theClass){
super(theClass)
}
Object invokeMethod(Object object, String methodName, Object[] arguments){
"MyMetaClass: ${super.invokeMethod(object, methodName, arguments)}"
}
}
class A{
def bark(){ 'A: invoked bark()' }
def invokeMethod(String name, Object args){
"A: missing $name(${args.join(', ')})"
}
}
def amc= new MyMetaClass(A)
amc.initialize()
def a= new A()
import org.codehaus.groovy.runtime.InvokerHelper
InvokerHelper.instance.metaRegistry.setMetaClass(A, amc)
//all newly-created instances of A after this call will be affected
assert a.bark() == 'A: invoked bark()' //created before so old MetaClass used
assert a.bleet() == 'A: missing bleet()'
assert new A().bark() == 'MyMetaClass: A: invoked bark()' //new MetaClass used
Thread.start{
assert a.bark() == 'A: invoked bark()' //old MetaClass used
assert new A().bark() == 'MyMetaClass: A: invoked bark()' //new MetaClass used
}
本例子可以看出,从Class层面来设定MetaClass,可以影响到设置之后创建的所有实例。