我在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的内容在这里是什么?一般来说,委托是什么,它有什么样的内容?
任何帮助和解释将不胜感激
你有一个错字; 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特别有用.