30

我想做的是扫描一组 Java 类,并跟踪来自抽象类的特定方法的所有方法调用,并在该上下文中,构建执行某些操作的所有代码的列表(在这种情况下,实例化某个类的实例)。我想知道行号和提供的参数。

我已经开始关注 BCEL,但它似乎没有内置调用图跟踪?我犹豫要不要自己写,因为获得重载、类型签名和多态调度权可能很棘手。

我有一半期望存在工具或示例代码,但我还没有找到任何东西。真的感觉我要重新发明一个轮子了。但如果我这样做,它将是一个开源轮子,可以在 GitHub 上找到;-)

PS:你会发现现有的问题“ How to Generate a Java Call Graph ”,因为听起来一样,但它根本不是我需要的。

4

7 回答 7

8

您可以使用java-callgraph工具套件为 Java 创建足够准确的静态和动态调用图。

于 2012-05-18T08:09:28.707 回答
6

您可以将DoxygenGraphviz一起使用。它易于安装和使用。

于 2012-01-30T10:35:14.337 回答
6

您可以尝试JavaDepend,它提供了依赖项和指标所需的许多功能,它还提供了类似 SQL 的 CQL 来请求您的代码库。

披露:这是一个商业软件。

于 2011-10-26T19:43:35.770 回答
5

Soot 应该可以让您轻松实现所需的内容:http: //www.sable.mcgill.ca/soot/

它可以全自动构建精确的调用图。

您可以在此处找到所有必要的文档:http: //www.sable.mcgill.ca/soot/tutorial/index.html

此外,还有一个用于 Soot 的活动邮件列表。

于 2011-03-06T12:16:55.763 回答
2

听起来您想要提供对抽象语法和完整符号表的访问的东西。然后,对调用图中函数的 AST 进行自定义扫描,这些函数植根于抽象方法的每个实现方法(如符号表所示),使您有机会找到其类型为感兴趣的特定类的新操作。

DMS Software Reengineering Toolkit是一种通用的编译器技术,提供解析、AST 构建/导航、符号表构建/导航、控制流、数据流和调用图构建等基本服务。DMS 有一个可选的Java 前端,它提供完整的 Java 解析器、构建 Java AST 和符号表,并且可以构建调用图。Java 前端也可以读取 .class 文件;你不清楚你是否也想爬进类文件,寻找信息。

你想要的答案不是现成的。您需要构建一些自定义代码来实现第一段中的想法,但 DMS 可以提供大部分原材料。它没有提供来自 .class 文件的太多细节(这些文件主要用于解析源代码中的类型)。

于 2011-03-06T08:54:48.670 回答
0

对于“最近”的 Eclipse 安装(相对于问题),请参阅Certiv CallGraph

CallGraph 支持对程序调用关系和流排序进行图形分析。还可以探索扩展的类继承层次结构。

调用路径分析和类层次结构解析是使用 JDT 平台搜索和调用层次结构机制执行的。

序列图是通过对任何选定类或方法的 JDT 平台 AST 的静态分析生成的。

使用 Zest 作为图形可视化引擎。

您可以通过Eclipse 市场安装它。我不参与制作这个。您不能缩小,这不是很实用,但支持序列图,这很好,允许根据需要打开/关闭节点以进一步挖掘。

要求:

Eclipse 4.6 (Neon) on Java 8 VM
Eclipse Zest Visualization Toolkit 1.7

Eclipse 公共许可证 v1.0

于 2020-03-10T12:15:25.930 回答
0

你可以看到: https ://github.com/Adrninistrator/java-all-call-graph/blob/main/README-en.md

输出示例:

  • 向上
org.mybatis.spring.SqlSessionUtils:lambda$closeSqlSession$6(org.apache.ibatis.session.SqlSession)
[0]#org.mybatis.spring.SqlSessionUtils:lambda$closeSqlSession$6(org.apache.ibatis.session.SqlSession)
[1]#  org.mybatis.spring.SqlSessionUtils:closeSqlSession(org.apache.ibatis.session.SqlSession,org.apache.ibatis.session.SqlSessionFactory)
[2]#    org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor:invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object[])    !entry!

org.mybatis.spring.SqlSessionUtils:lambda$getSqlSession$0()
[0]#org.mybatis.spring.SqlSessionUtils:lambda$getSqlSession$0()
[1]#  org.mybatis.spring.SqlSessionUtils:getSqlSession(org.apache.ibatis.session.SqlSessionFactory) !entry!
[1]#  org.mybatis.spring.SqlSessionUtils:getSqlSession(org.apache.ibatis.session.SqlSessionFactory,org.apache.ibatis.session.ExecutorType,org.springframework.dao.support.PersistenceExceptionTranslator)
[2]#    org.mybatis.spring.SqlSessionUtils:getSqlSession(org.apache.ibatis.session.SqlSessionFactory)   !entry!
[2]#    org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor:invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object[])    !entry!
  • 向下
org.mybatis.spring.SqlSessionFactoryBean:scanClasses(java.lang.String,java.lang.Class)
[0]#org.mybatis.spring.SqlSessionFactoryBean:scanClasses(java.lang.String,java.lang.Class)
[1]#  org.springframework.util.StringUtils:tokenizeToStringArray(java.lang.String,java.lang.String)
[1]#  org.springframework.util.ClassUtils:convertClassNameToResourcePath(java.lang.String)
[1]#  org.springframework.core.io.support.ResourcePatternResolver:getResources(java.lang.String)
[1]#  org.springframework.core.type.classreading.MetadataReaderFactory:getMetadataReader(org.springframework.core.io.Resource)
[1]#  org.springframework.core.type.classreading.MetadataReader:getClassMetadata()
[1]#  org.springframework.core.type.ClassMetadata:getClassName()
[1]#  org.apache.ibatis.io.Resources:classForName(java.lang.String)
[2]#    org.apache.ibatis.io.ClassLoaderWrapper:classForName(java.lang.String)
[3]#      org.apache.ibatis.io.ClassLoaderWrapper:getClassLoaders(java.lang.ClassLoader)
[3]#      org.apache.ibatis.io.ClassLoaderWrapper:classForName(java.lang.String,java.lang.ClassLoader[])
[1]#  org.mybatis.spring.SqlSessionFactoryBean:lambda$scanClasses$19(org.springframework.core.io.Resource,java.lang.Throwable)
于 2021-07-06T05:55:44.777 回答