Grails插件允许你在运行时注册Grails管辖类或者其他类的动态方法,但新的方法只能通过doWithDynamicMethods 闭包来增加。
对Grails管辖类来说,比如controllers、tag libraries等等,你可以增加方法,构造函数等,这是通过 ExpandoMetaClass 机制做到的,比如访问每个控制器的 MetaClass 的代码
如下所示:class ExamplePlugin {
def doWithDynamicMethods = { applicationContext ->
application.controllerClasses.each { controllerClass ->
controllerClass.metaClass.myNewMethod = {-> println "hello world" }
}
}
}
此处我们通过隐含的application对象来获取所有控制器类的MetaClass实例,并且为每一个控制器增加一个 myNewMethod 的方法。
或者,你已经知道要处理的类的类型了,那你只需要在此类的 metaClass 属性上增加一个方法即可,代码如下:class ExamplePlugin {
def doWithDynamicMethods = { applicationContext ->
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()
}
assert "UpAndDown" == "uPaNDdOWN".swapCase()
}
}
此例中,我们直接在 java.lang.String 的 metaClass 上增加一个新的 swapCase 方法.