Dón*_*nal 8 grails groovy metaprogramming
我的理解是Grails应用程序中有两个显而易见的地方可以进行元编程:
init
关闭Bootstrap.groovy
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应用程序中无效?
根据您的用例,Groovy AST 转换是第三种选择。AST 转换是在编译时对字节码的修改。它们从 Groovy 1.6 开始就可用,并且在 Groovy 1.7 中得到了很大的改进。特别是。ASTBuilder 是一种非常优雅的方式。
请注意,在 Grails 中使用 AST 可能需要对构建进行一些修改。执行 AST 的类必须在受 AST 约束的类之前编译。这可以通过挂接到scripts/_Events.groovy 中的“CompileStart”事件并首先预编译转换来轻松完成。
归档时间: |
|
查看次数: |
1574 次 |
最近记录: |