Grails控制器的"expando"方法来自哪里?

Jam*_*ers 0 grails

根据文档,Grails控制器只是一个类,"Controller"附加到名称并保存在其中grails-app/controllers/.这类中最简单的是:

package some.package

class FooController {
  def index = {}
}
Run Code Online (Sandbox Code Playgroud)

运行Grails应用程序时,此控制器将继承一些标准方法,如getParams和getSession.从附带的屏幕截图中我可以看到这些是通过添加的groovy.lang.ExpandoMetaClass.我没看到的是这是怎么发生的.控制器不实现任何接口或扩展任何抽象.这些方法来自哪里?

控制器对象图

dma*_*tro 5

从Grails 2.0开始,一种新的方法适用于将动态方法添加到控制器伪像中.您可以逐步访问它们以查看如何将这些属性添加到控制器: -

现在,在Grails 2.0之前,我们采用了一种不同的方法来为控制器添加动态属性.这样,metaClass属性在运行时被添加到控制器,发现效率较低.每个动态属性都由它自己的类(即:GetParamsDynamicProperty,GetSessionDynamicProperty)表示,它现在没有被使用.

所以,你现在需要看看在那些动态方法的对象树是什么这其中CachedMethods控制器可用.希望有所帮助.如果你寻求更多,我会很高兴添加更多.:-)