Metaprogramación con Convenio Basado en el Nombre del Paquete

The idea is that any package.class can have a custom meta class loaded at startup time by placing it into a well known package with a well known name.

    groovy.runtime.metaclass.[YOURPACKAGE].[YOURCLASS]MetaClass

So your class Foo in package "bar" could have a custom meta class FooMetaClass in package "groovy.runtime.metaclass.bar".

generaciondecodigos@nereida:~/Lgroovy/objects$ tree
.
|-- DelegatingMetaClassPackageImpliedTest.groovy
`-- groovy
    `-- runtime
        `-- metaclass
            `-- java
                `-- lang
                    |-- StringMetaClass.class
                    `-- StringMetaClass.groovy

generaciondecodigos@nereida:~/Lgroovy/objects$ cat -n groovy/runtime/metaclass/java/lang/StringMetaClass.groovy 
     1  package groovy.runtime.metaclass.java.lang
     2  
     3  class StringMetaClass extends groovy.lang.DelegatingMetaClass
     4  {
     5      StringMetaClass(MetaClass delegate)
     6      {
     7          super(delegate);
     8      }
     9  
    10      public Object invokeMethod(Object a_object, String a_methodName, Object[] a_arguments)
    11      {
    12          return "changed ${super.invokeMethod(a_object, a_methodName, a_arguments)}"
    13      }
    14  }

generaciondecodigos@nereida:~/Lgroovy/objects$ cat -n DelegatingMetaClassPackageImpliedTest.groovy 
     1  class DelegatingMetaClassPackageImpliedTest 
     2  {
     3      static void main(String[] args) {
     4          println "hello world".toString()
     5      }
     6  }

generaciondecodigos@nereida:~/Lgroovy/objects$ groovyc groovy/runtime/metaclass/java/lang/StringMetaClass.groovy 
generaciondecodigos@nereida:~/Lgroovy/objects$ groovy DelegatingMetaClassPackageImpliedTest.groovy 
changed hello world

Véase También



Subsecciones
Casiano Rodríguez León
2010-04-30