...
| Code Block |
|---|
import org.codehaus.groovy.runtime.InvokerHelper
class DelegatingMetaClassInvokeHelperTest extends GroovyTestCase
{
void testReplaceMetaClass()
{
/*
* Constructing first instance before meta class replacment
* is made.
*/
def firstInstance = "first"
assertEquals "first", firstInstance.toString()
def myMetaClass = new MyDelegatingMetaClass(String.class)
def invoker = InvokerHelper.instance
invoker.metaRegistry.setMetaClass(String.class, myMetaClass)
/*
* Constructing second instance after meta class replacment
* is made.
*/
def secondInstance = "second"
/*
* Since we are replacing a meta class at the class level
* we are changing the behavior of the first and second
* instance of the string.
*/
assertEquals "changed first", firstInstance.toString()
assertEquals "changed second", secondInstance.toString()
}
}
class MyDelegatingMetaClass extends groovy.lang.DelegatingMetaClass
{
MyDelegatingMetaClass(final MetaClassClass delegateaclass)
{
super(delegateaclass);
initialize()
}
public Object invokeMethod(Object a_object, String a_methodName, Object[] a_arguments)
{
return "changed ${super.invokeMethod(a_object, a_methodName, a_arguments)}"
}
}
|
...
| Code Block |
|---|
package groovy.runtime.metaclass.java.lang
class StringMetaClass extends groovy.lang.DelegatingMetaClass
{
StringMetaClass(MetaClassRegistry a_registry, final Class a_classMetaClass delegate)
{
super(a_classdelegate);
}
public Object invokeMethod(Object a_object, String a_methodName, Object[] a_arguments)
{
return "changed ${super.invokeMethod(a_object, a_methodName, a_arguments)}"
}
}
|
...