【发布时间】:2011-02-23 13:59:15
【问题描述】:
我的理解是 Grails 应用程序中有两个明显的地方可以进行元编程:
-
init关闭Bootstrap.groovy - 插件的
doWithDynamicMethods闭包
我在这里提到的元编程应该在整个应用程序中都是可见的,典型的例子包括添加(或替换)第 3 方类的方法。
String.metaClass.myCustomMethod = { /* implementation omitted */ }
(1) 的缺点是,在动态重新加载应用程序时不会应用元编程。 (2) 的缺点是我需要创建和维护一个完整的插件只是为了一点元编程。
有没有更好的地方来做这种元编程?
更新
根据 Ted 下面的建议,我将以下类添加到 src/groovy
package groovy.runtime.metaclass.java.lang
/**
* Adds custom methods to the String class
*/
class StringMetaClass extends DelegatingMetaClass {
StringMetaClass(MetaClass meta) {
super(meta)
}
Object invokeMethod(Object object, String method, Object[] arguments) {
if (method == 'hasGroovy') {
object ==~ /.*[Gg]roovy.*/
} else {
super.invokeMethod object, method, arguments
}
}
}
然后重新启动应用程序并在 Grails 控制台中运行以下代码:
assert 'mrhaki loves Groovy'.hasGroovy()
我遇到了以下异常
groovy.lang.MissingMethodException: No signature of method:
java.lang.String.hasGroovy() is applicable for argument types: () values: []
是我做错了什么还是有什么原因在 Grails 应用程序中不起作用?
【问题讨论】:
-
很遗憾没有一个简单的答案...
-
(1) 仍然如此吗?我刚试过(只是一个简单的例子),一切似乎都很好(我可以更改控制器和引导程序本身,并且更改是热重新编译的)。
标签: grails groovy metaprogramming