如何(静态)分析java代码并提取构造函数或方法中的实际参数值?

如何(静态)分析java代码并提取构造函数或方法中的实际参数值?,java,static-analysis,Java,Static Analysis,我希望有一个工具可以找到(Java)构造函数/方法的所有实例,并报告每次调用的实际参数值 我想还没有准备好什么,我还需要静态分析 您建议使用哪个库/程序 (我必须分析Java代码,但可以使用任何语言编写分析器)您需要一个工具,该工具可以解析Java,构建捕获代码的AST(以便您可以搜索代码中的方法调用),可以解析类型和名称(以便您知道每个符号实例的含义,并可以确定特定标识符命名方法)有趣的是,不仅仅是一个符号(名称相同),还可以帮助您生成方法调用 Java编译器提供了一些API来支持其中一些。我

我希望有一个工具可以找到(Java)构造函数/方法的所有实例,并报告每次调用的实际参数值

我想还没有准备好什么,我还需要静态分析

您建议使用哪个库/程序


(我必须分析Java代码,但可以使用任何语言编写分析器)

您需要一个工具,该工具可以解析Java,构建捕获代码的AST(以便您可以搜索代码中的方法调用),可以解析类型和名称(以便您知道每个符号实例的含义,并可以确定特定标识符命名方法)有趣的是,不仅仅是一个符号(名称相同),还可以帮助您生成方法调用

Java编译器提供了一些API来支持其中一些。我不知道它是否能帮助您重新生成方法调用文本


我们的DMS软件再工程工具包提供了通用的程序分析和转换功能,包括解析、AST构建/访问、符号表构建和任意子树的预打印(文本再生)。它有一个完整的Java前端,提供全名和类型解析。通过DMS提供的支持,编写一个准确、可靠的工具来做您想做的事情是非常简单的。

您可以使用AspectJ。在构造函数上定义切入点。然后编写一个方面在每次调用时执行。然后将方面应用于整个项目


aspect中的代码被提供给调用链的详细信息,因此您可以自己查询参数,并以任何方式记录它们。

您的意思是在运行时静态确定变量吗?您将如何处理IO数据(用户输入、文件等)和系统数据(例如系统时间)?IntelliJ可以告诉您是否从未调用过某个方法,或者某个参数仅具有相同的值。它不会告诉您是否有多个可能的值,但这可能是一个开始。@SJuan76在我的例子中,值从来都不是由I/O生成的。无论如何,我不需要(构建?)一个完美的工具,而是能够解析常量、简单字符串操作和(简单)调用的工具。@PeterLawrey我需要为数百个调用构建一个报告。我不能手工做这件事。理想情况下,我会从一些预先存在的库开始构建一个指定的工具。@OGrandeDiEnne IntelliJ默认情况下会为您的所有代码(或其中的一部分)执行此操作,并提供一些快速修复,这意味着您可能会对其进行更正。如果您生成了一个长报告,手动修复所有代码仍然会很乏味。这听起来很有趣。我从未用AspectJ编程。我必须修改原始代码才能运行方面吗?不,您不需要修改代码。这是使用它的一大好处。您可以在开发构建的同时构建它,并将其从生产构建中排除。我感觉Eclipse项目使用它来获取API方法调用的计时指标。读一读,你会有很多想法。