方法的调用树:覆盖工具在Java中如何工作?有API吗?

方法的调用树:覆盖工具在Java中如何工作?有API吗?,java,code-coverage,Java,Code Coverage,我正在寻找一种在java运行时列出其他方法调用的所有方法(调用树)的方法 我正在寻找一个api或输出,可以让我使用脚本的数据 有什么想法吗 Thx嗯……首先,这是一个好问题……我高度怀疑市场上是否有这样的实用程序……然而,有一些方法可以解决这个问题…比如在您最喜欢的IDE(如Eclipse和Netbeans)中使用调试器工具…覆盖和分析工具主要采用两种技术:定期轮询JVM以了解各种线程的状态,或者检测应用程序字节码以从JVM中推出相关数据 java语言本身没有直接的API支持,但是您可以利用许多

我正在寻找一种在java运行时列出其他方法调用的所有方法(调用树)的方法

我正在寻找一个api或输出,可以让我使用脚本的数据

有什么想法吗


Thx

嗯……首先,这是一个好问题……我高度怀疑市场上是否有这样的实用程序……然而,有一些方法可以解决这个问题…比如在您最喜欢的IDE(如Eclipse和Netbeans)中使用调试器工具…

覆盖和分析工具主要采用两种技术:定期轮询JVM以了解各种线程的状态,或者检测应用程序字节码以从JVM中推出相关数据

java语言本身没有直接的API支持,但是您可以利用许多工具:

  • 您可以使用jstack或类似工具捕获线程转储,将它们保存到文件中,然后进行分析(或编写脚本/程序进行分析),这就是轮询
  • 使用ASM或BCEL修改应用程序的字节码,这是推送,但很难做到
  • 使用AspectJ,使用加载时编织代理,它只是一个命令行参数来启用它
  • 解决方案3更容易、更干净、更通用

    要在运行时打印,作为方法执行的结果调用的任何方法都是一个简单的跟踪方面,类似于:

    public aspect TraceCalls {
      pointcut aCall : call(* *(..));
      pointcut inside : cflow(execution(public MyClass.MyMethod(..)));
      before() : aCall() && inside() {
        System.out.println(thisJoinPoint);
      }
    }
    
    显然,您可以访问更多的数据,将它们打印到文件中,格式化等等


    (请注意,我在这里编写了这段代码,因此可能会有很多语法错误)

    正确的方法是使用静态分析器,查看您的代码 并确定可能的呼叫者集。这会告诉你什么 可以在任何(保守的)情况下调用方法。 我们的its可以配置为执行此操作。它支持计算点进行分析;方法调用本质上是通过类方法向量进行的调用

    作为穷人的替代品,您可以使用捕获调用树的分析工具。 这将只让您通过特定的程序运行执行调用,而不是所有可能的调用上下文

    我们将生成一个调用树