Grails和Groovy metaProgramming委托

Don*_*zio 1 grails groovy

我在groovy元编程中有一些关于委托的noob问题.

用这行代码

grailsApplication.domainClasses.each { gdc ->
 def domClass = gdc.clazz
 domClass.metaClass.invokeMethod{name,args ->
 //some line of code
 def result = invokeMethod(delegate,args)
 }
}
Run Code Online (Sandbox Code Playgroud)

代表,名称和args的内容在这里是什么?一般来说,委托是什么,它有什么样的内容?

任何帮助和解释将不胜感激

Bur*_*ith 5

你有一个错字; domClass.metaClass.invokeMethod{name,args ->应该是domClass.metaClass.invokeMethod = { String name,args ->.这是将Closure指定为该类上所有方法调用的处理程序.由于您正在处理方法调用,因此您需要知道方法的名称和方法参数,因此这些是闭包的参数.该args参数将是一个Object[]包含方法调用的args 的数组.因此,例如domClass.foo()将具有名称"foo"和一个空args数组,domClass.foo("purple")将具有包含字符串"purple"的1元素数组,等等.

想想delegate作为this瓶盖内.this实际上是定义Closure的类实例,而不是闭包本身或调用该方法的对象.因为你经常需要这个对象,所以delegate指向它.通常,委托将是定义闭包的包含实例,因此通过查看方法调用来解析方法调用,如果没有找到,则抛出丢失的方法异常.但是您可以将委托设置为另一个具有被调用方法的处理程序,并将委托给它.这对于Groovy构建器和DSL特别有用.