【问题标题】:Advanced Method Call Hierarchy generation for Java?Java的高级方法调用层次结构生成?
【发布时间】:2017-04-01 20:17:22
【问题描述】:

我有一些未知的大型企业 Spring 项目,我需要在它上面执行此类任务:

"我有方法A和方法B,在方法A执行过程中,可以 方法 B 被调用?”

我发现 IntelliJ Idea 中有 Method Call Hierarchy 函数。我可以在方法 B 上执行此功能并生成调用层次结构,在其中我可以为方法 A 执行 serarch。不幸的是,IntelliJ 在计算此层次结构期间冻结,因为它太大并且在工作 5 小时后崩溃。

我需要性能比 IntelliJ Idea 更好的 Method Call Hierarchy 实用程序,但我没有找到它。你能帮帮我吗?

【问题讨论】:

  • 你真的需要完整的层次结构吗?通过使用“查找定义”和“查找用法”导航,您可能会很好地了解什么是什么。此外,我认为 IntelliJ 可以向您展示包之间的依赖关系,这可能是一个更好的整体开始。
  • 我尽可能地将调用层次结构的范围最小化到我感兴趣的最小模块集。即使使用 Find Usages 功能,我也无法想象执行手动搜索。甚至 IntellJ 冻结的方法 B 之上的调用层次结构树的额外大小证明了这个项目是多么复杂/复杂:/
  • 等等,你是说单次“查找用法”上的 OOM 吗?另外,你试过给它更多的内存吗?
  • 方法调用层次结构实际上是“Find Usages above Find Usages above Find Usages etc.”。它不会在方法 B 上面的单个 Find Usages 期间崩溃,但在第 12 层 Find Usages 之后。我尝试用 4096MB 内存运行 IntelliJ Idea,但它并没有因为内存不足而崩溃。在计算过程中,我一直在监控性能,并且 Idea 中的方法调用层次结构仅在一个线程之上运行(这非常慢),并且在崩溃前 Idea 的内存消耗约为 1700MB。
  • 好吧。您可以查看此答案*.com/questions/4951517/… 了解其他一些工具。

标签: java spring intellij-idea analysis


【解决方案1】:

考虑使用 AOP 功能进行方法拦截和执行路径修改。 Spring AOP 支持可能就足够了。 thisthis 问题可能会有所帮助

【讨论】:

  • 问题实际上是关于静态分析而不是运行时检测
【解决方案2】:

尝试 alt + f7,或者也使用调试器来使用调用序列。

【讨论】:

  • alt + f7 - Find Usages 正是调用方法层次结构在方法调用层次结构树的每一层之上执行的操作。一样的,不能帮我完成任务,因为那个项目真的很复杂。
【解决方案3】:

一种解决方法可能是使用调试器。在方法 A 中设置断点 1,在方法 B 中设置断点 2。 然后在 Breakpoints 对话框中将断点 1 配置为不挂起。并将断点2配置为disabled until selected breakpoint is hit并选择断点1。现在在调试器中运行项目或一些测试并检查断点2是否命中。

【讨论】: