我的理解是,Grails应用程序中有两个明显的地方可以进行元编程:

  • initBootstrap.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/

    10-11 08:14