grails元编程

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

  • Bootstrap.groovyinit关闭
  • 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应用程序中无法使用?


    查看委托MetaClass,它是groovy的一部分,并使您的元类从一开始就更改为在该类的每个实例上使用的元类的一部分。 它运行在一个简单的会议上,甚至可以在Grails之外工作。


    根据您的使用情况,Groovy AST转换是第三种选择。 AST转换是编译时字节码的修改。 从Groovy 1.6开始就可以使用它们,并且在Groovy 1.7中进行了大量改进。 ESP。 ASTBuilder是一个非常优雅的方式。

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


    您可以使用DelegatingMetaClass解决方案,但需要将其打包到JAR文件中,然后添加到lib目录中。

    使用以下Gradle构建文件创建一个新目录:

    apply plugin: 'groovy'
    repositories.mavenCentral()
    dependencies { groovy: 'org.codehaus.groovy:groovy-all:1.8.6' }
    

    在src / main / groovy目录中,您可以放置​​StringMetaClass源代码。 使用$ gradle jar,您可以创建JAR文件,然后将其复制到您的Grails应用程序的lib目录中。

    链接地址: http://www.djcxy.com/p/45901.html

    上一篇: grails metaprogramming

    下一篇: Square Connect API List Locations and Inventory Adjust return 404 not found