grails元编程

Dón*_*nal 8 grails groovy metaprogramming

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

  1. init关闭Bootstrap.groovy
  2. doWithDynamicMethods插件关闭

我在这里引用的元编程应该在整个应用程序中可见,典型的例子包括添加(或替换)第三方类的方法.

String.metaClass.myCustomMethod = { /* implementation omitted */ }
Run Code Online (Sandbox Code Playgroud)

(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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后重新启动应用程序并在Grails控制台中运行以下代码:

assert 'mrhaki loves Groovy'.hasGroovy()
Run Code Online (Sandbox Code Playgroud)

我得到以下异常

groovy.lang.MissingMethodException: No signature of method:
java.lang.String.hasGroovy() is applicable for argument types: () values: []
Run Code Online (Sandbox Code Playgroud)

我做错了什么或者是否有理由在Grails应用程序中无效?

Ste*_*ter 1

根据您的用例,Groovy AST 转换是第三种选择。AST 转换是在编译时对字节码的修改。它们从 Groovy 1.6 开始就可用,并且在 Groovy 1.7 中得到了很大的改进。特别是。ASTBuilder 是一种非常优雅的方式。

请注意,在 Grails 中使用 AST 可能需要对构建进行一些修改。执行 AST 的类必须在受 AST 约束的类之前编译。这可以通过挂接到scripts/_Events.groovy 中的“CompileStart”事件并首先预编译转换来轻松完成。