我需要使用它的源代码诊断类中的所有被调用方法(在类中声明或不在语句中声明)。将类源代码作为输入提供给方法的方法,并将类作为输出获取调用的方法。实际上我需要一个与java词法分析器相同的类/方法。 有没有方法可以诊断所有被调用的方法?
当然我尝试使用Runtime.traceMethodCalls();解决问题,但没有输出。我已经读过我需要用java -g运行java调试但不幸的是当我尝试运行java -g时会出错。那我该怎么办?有什么方法吗?
答案 0 :(得分:5)
1)在一般情况下,没有。 Reflection将始终允许代码进行无法实际运行代码时无法分析的方法调用。
2)跟踪方法调用也不会给你完整的图片,因为一种方法不能保证(甚至可能)使 全部 每次你打电话都可以打电话。
您最好的选择是某种“尽力而为”的代码分析。您可能想尝试使用编译器的帮助。例如,编译代码并分析生成的所有发出的外部符号的类文件。它不能保证能够接听每一个电话(见#1),但在大多数情况下它会让你接近。
答案 1 :(得分:1)
从您的问题来看,很难确定您要解决的问题究竟是什么。 但万一:
如果要查看运行时调用某些方法的位置,则可以使用分析工具收集有关这些方法调用的信息。根据工具,您还可以看到调用这些方法的位置。但是请记住,当你执行程序时,不能保证从每个可能的地方调用你感兴趣的方法。
如果您正在开发一种用于显示方法调用图的自动化工具。然后,您需要解析源代码并开始使用代码实体。一种方法是实现自己的编译器并从那里继续。但更简单的方法是重用开源解析器/编译器/分析器并围绕它构建工具。
这两种产品都有巨大的代码库,因此隔离有趣的部分将很困难。但它仍然比编写自己的java编译器更容易,并且证明它适用于每个角落的情况。
答案 2 :(得分:1)
您可以将Java的一个开源静态分析器作为起点。 Checkstyle允许您构建自己的模块。 Soot有一个非常灵活的API,是call analysis的一个很好的例子。 FindBugs也可能允许您编写自定义模块。 AFAIK这三种都可以以JAR的形式嵌入,因此您可以将您想出的任何内容整合到您自己的自定义程序中。
答案 3 :(得分:0)
如上所述,为了分析字节码,您可以查看 JBoss字节码。它更适用于测试,但也可能有助于分析代码。
答案 4 :(得分:0)