5

通常在 Spring Source Tool Suite IDE 或 Eclipse Maven 项目中,如果我想查看框架/库方法在幕后做什么,我可以 ctrl + 单击方法名称,它会将我带到源代码。我知道很多 Grails 方法是在运行时动态添加的,因此 IDE 并不总是可能知道如何获取它们。否则,我可以在 Google、Github 或 API 文档上按包搜索类。使用 Grails 核心源代码更好地理解框架的最佳方法是什么?

例如,我想查看控制器中的响应方法是什么样的,以及当 index 方法看起来像这样时,它如何将名为“clubInstanceList”的参数返回给我的俱乐部/索引 gsp:

def index(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    respond clubService.list(params), model:[clubInstanceCount: clubService.count()]
}

ctrl + click 在 IDE 中不起作用,因为此方法是在运行时添加的。我在 github 上搜索了 Grails 核心源,但不知道控制器上此响应方法的包结构。

4

2 回答 2

5

这可能不是一个简单的搜索,因为一些代码是在编译期间生成的,或者可以在运行时将特性添加到您的类中。这是您在使用动态语言时付出的代价。

动态运行时方法

当我需要找到一些不太明显的功能时,我首先尝试找到负责该功能的内部插件。在 STS 中,我ctrl shift T搜索并搜索*GrailsPlugin*. doWithDynamicMethods您可以在插件关闭时检查运行时更改。

例如,Grails 具有ControllersGrailsPlugin为控制器类添加数据绑定功能的类。

搜索方法

由于我在这个插件描述符中没有找到与该respond方法相关的任何内容,这可能是通过编译产生的。您可以使用ctrl H并进行 Java 搜索,method在“搜索”框中进行标记。在scope标记中workspace,STS 也会查找 Grails 类。

答案

因此,您的问题的答案是ControllersRestApi课程,我使用“搜索方法”方法找到了它。

于 2014-01-10T16:11:25.387 回答
0

我有同样的问题,发现 Sergio 的回答很有帮助,但这里有另一种方法:加载调试器并使用 F5 逐步完成。现在,除非您启用步骤过滤器,否则这可能会让人筋疲力尽(请参阅 GGTS/STS/Eclipse 帮助)。特别是,我建议过滤掉org.springsource.loaded.*,除了预先选择的包。这消除了很多反射和动态部分——至少在这种情况下——你不关心。

我还要补充一点,我的任务是发现这个问题以改进响应方法文档:

https://jira.grails.org/browse/GRAILS-10721

因此,我们并不是唯一对此感到头疼的人。

于 2014-07-07T22:38:44.387 回答