Grails 1.1 运行时添加动态方法 - 基础知识

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 方法.