ExpandoMetaClass(可扩展元类)

使用ExpandoMetaClass来增加行为

从Groovy1.1开始,你可以使用一种被称为ExpandoMetaClass(可扩展元类)的特殊元类,并通过一种简洁的闭包语法动态地添加方法、构造器、属性和静态方法。

它是怎样工作的?每一个java.lang.Class都提供了一个特殊的“metaClass”属性,当你使用它的时候,就能获得一个ExpandoMetaClass实例的引用。

举例来说,要获得Java类java.lang.String的ExpandoMetaClass,你可以这样做:

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()
}

这将为String类添加一个名为swapCase的方法。

8-O注意:默认情况下,通过ExpandoMetaClass添加的方法并不能被继承1),但如果你想那么做的话,你必须在你的应用程序运行之前(比如main方法中或者servlet启动时)调用ExpandoMetaClass.enableGlobally()。

深入阅读:

1) 译注:也就是说,通过基类的ExpandoMetaClass添加的方法,并不能在派生类中调用
2) 译注:原文为“Overriding invokeMethod for static methods”,与“覆盖静态invokeMethod”一项的解释一样,疑为“复制/粘贴”错误
 
wiki/user_guide/using_expandometaclass_to_add_behaviour.txt · 最后更改: 2008-09-29 22:32 由 johnny
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki