Java字节/源代码分析-如何以编程方式找到使用另一个类的所有类/方法?

时间:2018-08-28 16:46:12

标签: java bytecode java-bytecode-asm javassist

我需要以编程方式知道哪些类正在调用给定类的(例如X)getter和setter。这里的关键是“以编程方式”。

例如,如果类A使用X的setPropertyABC()而类B使用X的getPropertyABC(),则我想根据对X的调用来定义类之间的依赖关系-在这种情况下,类A的执行必须在类B之前

我需要以编程方式执行此操作(而不是通过IDE)。我想创建一个程序,该程序将查看类的已编译字节码或源代码,并弄清楚哪些类在给定类上使用哪些方法。为此目的使用的最佳Java库是什么?字节码工具更合适吗?我当时在想ANTLR是否可以完成这项工作,但我不确定。公共领域中是否有任何示例代码可以解决此问题?

3 个答案:

答案 0 :(得分:1)

也许您可以使用Aspects。您将拥有一个切入点,可以拦截该类的所有get*set*方法。顾问可以使用Thread.currentThread().getStackTrace()找出调用方法是什么,然后记录调查结果。这不完全是字节码分析技术,但可能更简单。

[edit]就计算两个类之间的某种时间依赖关系(其中一个依赖于其他人调用的setter)而言,顾问可以将有关每次调用的信息附加到某种插入顺序数据结构中(LinkedHashMap)。如果调用了getX,那么您将查看对setX的调用。

答案 1 :(得分:0)

几年前,我使用名为Dependency Finder的工具进行了练习,以分析源代码级别的依赖关系。我在http://dev.saxonica.com/blog/mike/2009/09/analyzing-dependencies-in-a-class-library-a-use-case-for-xslt-streaming.html

上报告了该项目

该工具输出有关模块之间依赖性的信息(以XML形式),并且可以根据报告的粒度进行配置。我对XML报告进行了相当多的分析(使用XSLT),以了解我需要的代码结构,在这种情况下,代码结构是整个OpenJDK库。

博客的重点是如何对一些非常大的XML文件进行分析,但我希望它能为您提供一些见识。

博客文章上的公众评论还指向其他一些依赖分析工具。

答案 2 :(得分:0)

考虑了所有替代方案之后,我决定使用ASM库进行字节码分析。它被证明是非常合适和有用的。谢谢大家的答复。