【问题标题】:Where do a Grails controller's "expando" methods come from?Grails 控制器的“expando”方法从何而来?
【发布时间】:2013-09-18 13:09:58
【问题描述】:

根据documentation,Grails 控制器只是一个在名称后附加“Controller”并保存在grails-app/controllers/ 中的类。此类中最简单的是:

package some.package

class FooController {
  def index = {}
}

当 Grails 应用程序运行时,此控制器将继承一些标准方法,例如 getParamsgetSession。从随附的屏幕截图中,我可以看到这些是通过groovy.lang.ExpandoMetaClass 添加的。我没有看到这是如何发生的。控制器不实现任何接口或扩展任何抽象。这些方法从何而来?

【问题讨论】:

  • 添加方法和属性可以通过 Groovy 运行时和编译时元编程来完成。 Grails 使用这些策略使“魔法”发生。它按约定修改所有控制器。你是在问它的实际代码在哪里?
  • 这就像问彩虹是从哪里来的。他们太棒了,谁在乎!!
  • @JamesKleeh 如果这是唯一的答案,是的。当我对某事有疑问时,我不喜欢不知道在哪里寻找答案。在这种情况下,我在哪里可以了解控制器可用的所有“继承”方法以及它们的作用?到目前为止,我必须设置一个断点,挖掘图表,然后猜测。
  • @Gregg 如果没有人想知道彩虹的起源,我们就不会有棱镜。如果没有棱镜,我们就不会进行这种对话。

标签: grails


【解决方案1】:

从 Grails 2.0 开始,采用了一种新方法来将动态方法添加到控制器工件中。您可以逐步访问它们以查看这些属性是如何添加到控制器中的:-

现在,在 Grails 2.0 之前,采用了一种不同的方法来将动态属性添加到控制器。这种方式在运行时将元类属性添加到控制器中,发现效率较低。每个动态属性都由其自己的类(即:GetParamsDynamicProperty、GetSessionDynamicProperty)表示,目前未使用。

因此,您现在需要在对象树中查看这些动态方法的 this,其中 CachedMethods 在控制器中可用。希望有帮助。如果您寻求更多,我很乐意添加更多。 :-)

【讨论】:

  • 我不会把它当作一团糟,因为这个插件的定制方式反映了一种通过使用 AST 转换和如前所述 MetaClassEnhancer 的细粒度方法。作为一名作者,可以在连接珠子的同时完全控制框架。 :-) @jsumners
【解决方案2】:

你说得对,Grails 的“控制器”并不是真正意义上的控制器,因为它们从基类继承而来,而只是简单的 POGO,遵循放置在 grails-app/controllers 目录中的约定。编译您的应用程序时,通过 AST 转换混合了 30 多种方法,其中大部分来自

org.codehaus.groovy.grails.plugins.web.api.ControllersApi,也来自 org.codehaus.groovy.grails.plugins.converters.api.ConvertersControllersApi, org.codehaus.groovy.grails.plugins.web.api.ControllersMimeTypesApi

前面的内容是 Burt Beckwith 从 Programming Grails 转述的,如果您对 Grails 的更详细的细节感兴趣,我会推荐它。

【讨论】:

  • 感谢您提供课程链接。他们提供帮助。
【解决方案3】:

引自 Burt Beckwith 的优秀著作,Programming Grails

超过 30 种方法与 AST 混合到控制器类中 转变。大部分是从 org.codehaus.groovy.grails.plugins.web.api.ControllersApi

ControllersApi source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多