我的理解是,Grails应用程序中有两个明显的地方可以进行元编程:
init
的Bootstrap.groovy
闭包doWithDynamicMethods
关闭我在这里指的元编程在整个应用程序中都应该可见,典型示例包括添加(或替换)第三方类的方法。
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应用程序中不起作用?
最佳答案
检查Delegating MetaClass,它是groovy的一部分,并使您的元类更改从一开始就用于该类的每个实例的元类的一部分。它以简单的约定运行,甚至可以在grails之外运行。
关于Grails元编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2902970/