通常在Spring Source Tool Suite IDE或Eclipse Maven项目中,如果我想看看框架/库方法在幕后做什么,我可以ctrl+单击方法名称,它会带我进入源代码。我知道很多Grails方法都是在运行时动态添加的,所以IDE并不总是知道如何使用它们。否则,我可以在Google、Github或API文档中按包搜索类。使用Grails核心源代码来更好地理解框架的最佳方法是什么?
例如,我想看看控制器中的response方法是什么样子的,以及当index方法看起来像时,它如何向我的club/index gsp返回一个名为"clubInstanceList"的参数
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
respond clubService.list(params), model:[clubInstanceCount: clubService.count()]
}
ctrl+click在IDE中不起作用,因为这个方法是在运行时添加的。我已经在github上搜索了Grails核心源代码,但不知道控制器上这个响应方法的包结构。
这可能不是一个简单的搜索,因为有些代码是在编译时生成的,或者可以在运行时将功能添加到类中。这是使用动态语言时要付出的代价。
动态运行时方法
当我需要找到一些不太明显的功能时,我首先会尝试找到负责这一点的内部插件。在STS中,我执行ctrl
shift
T
并搜索*GrailsPlugin*
。您可以在插件的doWithDynamicMethods
闭包中检查运行时的更改。
例如,Grails有ControllersGrailsPlugin
类,它为控制器类添加了数据绑定功能。
搜索方法
由于我在这个插件描述符中没有发现任何与respond
方法相关的内容,所以这可能是通过编译完成的。您可以使用ctrl
H
,并进行Java搜索,在"搜索"框中标记method
。在scope
标记中,workspace
和STS也将查找Grails类。
答案
所以你的问题的答案是ControllersRestApi
类,我使用"搜索方法"找到了它。
我有同样的问题,并发现Sergio的答案非常有用,但这里有另一种方法:加载调试器并使用F5逐步完成。现在,除非启用步骤过滤器,否则这可能会让人筋疲力尽(请参阅GGTS/STS/Eclipse帮助)。特别是,除了预先选择的包之外,我建议过滤掉org.springsource.loaded.*
。这消除了许多反射和动态部分,至少在这种情况下,你不在乎这些部分。
我还将补充说,我的任务发现了这个问题,以改进响应方法文档:
https://jira.grails.org/browse/GRAILS-10721
所以我们并不是唯一对此感到头疼的人。