Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Using ExpandoMetaClass to add behaviour

Groovy 1.1 includes a special MetaClass called an ExpandoMetaClass that allows you to dynamically add methods, constructors, properties and static methods using a neat closure syntax.

How does it work? Well every java.lang.Class is supplied with a special "metaClass" property that when used will give you a reference to an ExpandoMetaClass instance.

For example given the Java class java.lang.String to obtain its ExpandoMetaClass you can use:

Code Block
String.metaClass.swapCase = {->
      def sb = new StringBuffer()
      delegate.each {
           sb << (Character.isUpperCase(it as char) ? Character.toLowerCase(it as char) : 
                   Character.toUpperCase(it as char))
      }
      sb.toString()
}

This adds a method called swapCase to the String class.

Note

By default ExpandoMetaClass doesn't do inheritance. To enable this you must call ExpandoMetaClass.enableGlobally() before your app starts such as in the main method or servlet bootstrap

Further Reading:

  1. Adding or overriding instance methods
  2. Adding methods to an instance
  3. Adding or overriding static methods
  4. Adding or overriding properties
  5. Adding or overriding constructors
  6. Adding methods on interfaces
  7. Dynamically creating method names
  8. Overriding invokeMethod, getProperty and setProperty
  9. Overriding invokeMethod for static methods
  10. Evaluating MetaClass instances at runtime
  11. Borrowing methods from other classes