是否有任何类来诊断java类中的调用方法?

时间:2012-02-19 07:09:03

标签: java

  1. 我需要使用它的源代码诊断类中的所有被调用方法(在类中声明或不在语句中声明)。将类源代码作为输入提供给方法的方法,并将类作为输出获取调用的方法。实际上我需要一个与java词法分析器相同的类/方法。 有没有方法可以诊断所有被调用的方法?

  2. 当然我尝试使用Runtime.traceMethodCalls();解决问题,但没有输出。我已经读过我需要用java -g运行java调试但不幸的是当我尝试运行java -g时会出错。那我该怎么办?有什么方法吗?

5 个答案:

答案 0 :(得分:5)

1)在一般情况下,没有。 Reflection将始终允许代码进行无法实际运行代码时无法分析的方法调用。

2)跟踪方法调用也不会给你完整的图片,因为一种方法不能保证(甚至可能)使 全部 每次你打电话都可以打电话。

您最好的选择是某种“尽力而为”的代码分析。您可能想尝试使用编译器的帮助。例如,编译代码并分析生成的所有发出的外部符号的类文件。它不能保证能够接听每一个电话(见#1),但在大多数情况下它会让你接近。

答案 1 :(得分:1)

从您的问题来看,很难确定您要解决的问题究竟是什么。 但万一:

  1. 如果您想分析源代码,看看它的哪些部分是冗余的并且可能被删除,那么您可以使用一些IDE(Eclipse,IntelliJ IDEA Community Edition等)。在IDE中,您可以使用以下功能来搜索方法,您还可以分析代码并将未使用的方法突出显示为警告/错误。
  2. 如果要查看运行时调用某些方法的位置,则可以使用分析工具收集有关这些方法调用的信息。根据工具,您还可以看到调用这些方法的位置。但是请记住,当你执行程序时,不能保证从每个可能的地方调用你感兴趣的方法。

  3. 如果您正在开发一种用于显示方法调用图的自动化工具。然后,您需要解析源代码并开始使用代码实体。一种方法是实现自己的编译器并从那里继续。但更简单的方法是重用开源解析器/编译器/分析器并围绕它构建工具。

    这两种产品都有巨大的代码库,因此隔离有趣的部分将很困难。但它仍然比编写自己的java编译器更容易,并且证明它适用于每个角落的情况。

答案 2 :(得分:1)

您可以将Java的一个开源静态分析器作为起点。 Checkstyle允许您构建自己的模块。 Soot有一个非常灵活的API,是call analysis的一个很好的例子。 FindBugs也可能允许您编写自定义模块。 AFAIK这三种都可以以JAR的形式嵌入,因此您可以将您想出的任何内容整合到您自己的自定义程序中。

答案 3 :(得分:0)

如上所述,为了分析字节码,您可以查看 JBoss字节码。它更适用于测试,但也可能有助于分析代码。

sven.malvik.de

答案 4 :(得分:0)

您可以插入编译器。

看一下Project Lombok的来源。 没有通用机制,所以他们有一个javac机制和一个eclipse编译器。

http://projectlombok.org/