https://github.com/Adrninistrator/java-all-call-graph
以下内容整理自通过微信公众号、搜索引擎等公开渠道获取的技术文章,其中明确提到了对 java-all-call-graph 或 java-callgraph2 的实际应用。若作者不希望相关信息被列出,可联系进行移除。
链接:https://mp.weixin.qq.com/s/pNhYzGoeCqp_zkOcNf0xgg
使用工具:java-all-call-graph、java-callgraph2
链接:https://mp.weixin.qq.com/s/ovzhSasR6QL7L5vlFILDgw
使用工具:java-callgraph2
链接:https://mp.weixin.qq.com/s/p9BcfNqLk2ZDUNcXukqXpg
使用工具:java-callgraph2
本项目致力于利用 Java 技术对 Java 应用进行自动化静态分析,将原本非结构化的代码信息转化为结构化数据,并存储至关系型数据库中,为开发、测试、安全审计等多个环节提供可靠的数据支持。
系统可对编译后的 Java 字节码执行静态解析,提取关键元素并写入数据库表,用户可通过标准 SQL 进行灵活查询。
支持识别的数据类型包括但不限于:
同时兼容部分主流框架的信息提取,例如:
具体使用方式详见文档:
对 Java 代码静态分析并支持 SQL 查询
支持从指定入口方法出发,向上追溯调用者或向下追踪被调用者,生成完整的正向或反向调用路径。
详细说明及使用方法见:
静态分析生成 Java 代码方法完整调用链
在生成完整调用链的基础上,进一步筛选出从起始方法到包含特定关键字方法之间的调用路径,模拟运行时堆栈行为,便于问题排查与流程理解。
详细说明及使用方法见:
静态分析生成 Java 代码方法调用堆栈
系统可在生成调用堆栈的同时,附加展示具有业务意义的上下文信息,如:
并支持基于这些信息从堆栈文件中提取关注点。
详细说明及使用方法见:
从方法调用堆栈文件提取关注的信息
当分析调用链或调用堆栈时,能够自动识别 MyBatis Mapper 方法所操作的 MySQL 数据库表名称,并将其作为上下文信息一并呈现。
支持对不同版本的 JAR 文件进行比对,识别出发生变更的方法集合,并基于此生成向上/向下的完整调用链,从而评估代码修改的影响边界。
此外,还可根据 MyBatis Mapper XML 中 SQL 语句的变化,定位到关联的 Mapper 方法,进而构建调用路径,辅助评估变更影响。
详细说明及使用方法见:
JarDiff 比较 jar 文件版本差异及代码影响范围
针对 Java 应用在升级 JDK 版本或第三方依赖库后可能出现的类、方法、字段缺失等问题,提供扫描机制以提前发现潜在的运行时异常风险。同时也支持检查命名高度相似但可能引发混淆的类。
详细说明及使用方法见:
Java 应用 JDK 及依赖库兼容问题扫描工具
能够在静态分析过程中,提取方法调用时传递的对象实例或参数所使用的具体常量值,以及参数的类型信息,增强调用上下文的理解能力。
详细说明及使用方法见:
静态分析获取 Java 代码方法调用参数类型或值
支持对由字符串常量、枚举常量、方法返回值等参与的字符串拼接表达式进行拆解,还原拼接前的各项输入内容,并推断最终拼接结果。
详细说明及使用方法见:
静态分析解析 Java 代码字符串拼接

建议先在 GitHub 上提交 issue 再展开讨论,以便更好地整理相关议题内容。后续具有参考价值且不重复的讨论内容将被汇总至正式文档中。
支持无需注册即可提问,但系统不会自动检索项目的最新代码内容。
网址:
https://deepwiki.com/Adrninistrator/java-all-call-graph
该平台通过大模型对项目源码进行深度解析,用户可就项目相关问题进行咨询,包括但不限于功能使用方式、调用逻辑等。
使用前需完成注册流程。
网址:
https://zread.ai/Adrninistrator/java-all-call-graph
功能与 DeepWiki 类似,均基于大模型实现对项目代码的理解与问答支持。
指一个方法(调用方)对另一个方法(被调方)的调用行为,包含以下信息:调用方法和被调方法的包名、类名、方法名、参数类型、返回值类型以及调用类型(如静态调用或实例调用)。
示例:
a.b.c.Caller:f1() 调用 a.b.c.Callee:f2(int, java.lang.String)
此类关系可视为由调用方法与被调方法构成的二元组,对应存储于数据库中的 method_call 表中。
描述在方法调用过程中涉及的具体上下文数据,例如:被调用对象或参数所使用的常量值、变量类型、变量对应的方法参数索引、其他方法调用的返回结果、类成员变量等。
这些信息写入数据库的 method_call_info 表。
针对某一 Java 项目,其全部方法之间形成的调用网络构成一个高度复杂的图结构。下图展示了一个简化的调用图示例:
从某个指定方法出发,向下延伸至所有直接或间接被其调用的方法,直到末端无进一步调用的方法为止,称为“向下完整调用链”;反之,从该方法向上追溯所有可能调用它的方法路径,直至没有上级调用者的方法,称为“向上完整调用链”。
完整调用链呈现树状结构,例如:
com.example.Main:main(String[]) ├─ com.example.service.UserService:getUserById(Long) │ ├─ com.example.repository.UserRepository:findById(Long) │ │ ├─ com.example.mapper.UserMapper:toEntity(ResultSet) │ │ └─ com.example.validator.IdValidator:validate(Long) │ └─ com.example.cache.UserCache:get(String) └─ com.example.util.Logger:info(String)
如下图所示:
无论是向上还是向下的完整调用链,均可视为整个项目调用图中的一个子图(虽以树形呈现,但由于可能存在循环调用,实际为图结构)。
在方法完整调用链的基础上,提取从起始方法到某一特定调用/被调方法之间的具体执行路径,即为方法调用堆栈。
调用堆栈为线性链表结构,例如:
com.example.Main:main(String[]) └─ com.example.service.UserService:getUserById(Long) └─ com.example.repository.UserRepository:findById(Long) └─ com.example.mapper.UserMapper:toEntity(ResultSet) com.example.Main:main(String[]) └─ com.example.util.Logger:info(String)
如下图中红色路径所示:
可以理解为,方法调用堆栈是完整调用链中的一条具体路径分支。
各组件之间的依赖结构如下:
本项目基于 java-text-to-excel 工具,并依赖 fastexcel 实现 Excel 文件的生成功能。
该阶段主要完成对 Java 字节码文件(如 JAR 包)的静态分析,并将分析结果持久化至数据库中。具体步骤如下:
java-all-call-graph 模块中的 RunnerWriteDb 类调用 java-callgraph2 库进行底层操作;java-callgraph2 负责读取待分析的 JAR 等二进制文件,执行静态代码分析,输出中间结果到文本文件;RunnerWriteDb 类读取上述生成的文本数据,并将其结构化地写入数据库。关于 RunnerWriteDb 的详细使用说明,请参见“当前项目能够做什么”章节中“对代码静态分析并支持 SQL 查询”的相关内容。
当前项目在执行时,首先需要解析代码并写入数据库
当被解析的代码发生变化时,需要重新执行当前步骤,使数据库中写入最新代码对应的数据
在完成数据入库后,系统进入第二阶段:从数据库提取所需信息,并按需生成各类分析报告或数据文件。
java-all-call-graph 中的不同类负责从数据库查询相关信息;
项目支持两种参数设定途径:通过外部配置文件定义,或直接在代码中编程式指定。两种方式效果一致,且所有配置项均在代码中有明确映射。
通过配置文件指定
通过代码指定
适用于单值配置项,分为两类:
每项配置由枚举常量表示,对应唯一的键值对,且每个参数仅允许设置一个确定值。
com.adrninistrator.jacg.conf.enums.ConfigKeyEnum
com.adrninistrator.jacg.conf.enums.ConfigDbKeyEnum
_jacg_config/config.properties
_jacg_config/config_db.properties
用于需要保持顺序的多值参数。对应的枚举类为:
com.adrninistrator.jacg.conf.enums.OtherConfigFileUseListEnum
每个枚举实例代表一个参数,关联一个独立的配置文件,其值可包含多个条目,并严格保留输入顺序。
适用于不关心顺序的多值参数。对应枚举类为:
com.adrninistrator.jacg.conf.enums.OtherConfigFileUseSetEnum
每个枚举常量标识一个参数,对应一个配置文件,允许设置多个值,但不保证顺序。
用于动态逻辑判断的表达式配置。对应枚举类为:
com.adrninistrator.jacg.el.enums.ElConfigEnum
每个参数值为一条完整的 EL 表达式字符串,用于条件计算或规则匹配。
详见“配置参数示例”文档部分。
详情请查阅“EL 表达式使用通用说明文档”。
具体规则见“EL 表达式字符串比较说明文档”。
可通过 com.adrninistrator.jacg.conf.ConfigureWrapper 类在程序中动态设置各类参数。常用方法如下:
| 方法名称 | 功能描述 |
|---|---|
| setMainConfig | 设置键值对形式的主配置参数(Map 格式) |
| setOtherConfigList | 设置有序的多值参数(List 格式) |
| setOtherConfigSet | 设置无序的多值参数(Set 格式) |
| setElConfigText | 设置 EL 表达式内容 |
通过 IDE 打开项目源码运行
在其他项目中引用当前项目的库运行
使用项目源码构建后运行
| 运行方式 | 支持的参数配置方式 |
|---|---|
| 通过 IDE 打开项目源码运行 | 支持通过配置文件指定、也支持通过代码指定 |
| 在其他项目中引用当前项目的库运行 | 支持通过配置文件指定、也支持通过代码指定 |
| 使用项目源码构建后运行 | 仅支持通过配置文件指定 |
若选择通过配置文件设定参数,可修改项目中相关配置文件内容,然后运行对应场景的入口类。这些入口类位于 test 模块下的 test.jacg 包内。
注意:应将运行模块设为 test,以便使 test 模块中的 log4j2 配置生效。
若希望在代码中直接指定参数,可直接调用各使用场景提供的示例方法,或以其为基础进行自定义修改。
可在第三方项目中使用 Maven 或 Gradle 引入本项目作为依赖库。
Maven 依赖配置示例如下:
<dependency> <groupId>com.github.adrninistrator</groupId>
使用 Gradle 进行依赖管理时,可参考以下配置:
<artifactId>java-all-call-graph</artifactId> <version>版本号</version> <type>pom</type>
implementation("com.github.adrninistrator:java-all-call-graph: 版本号")
最新版本信息可通过以下链接查看:
https://mvnrepository.com/artifact/com.github.adrninistrator/java-all-call-graph
本工具仅引入了 slf4j-api 组件,在引入本工具组件的项目中,还需要引入 log4j2、logback 等日志组件,且保证配置正确,能够在本地正常运行
由于 Maven 间接依赖的组件版本不会自动使用最大的版本号,因此可能需要在项目中手工指定 java-all-call-graph 依赖组件的版本号,避免因为依赖组件版本不一致导致问题,可通过 java-all-call-graph 与 java-callgraph2 的 pom 文件的 dependencies 元素查看依赖组件版本
运行 java-all-call-graph 库中提供的类 com.adrninistrator.jacg.unzip.UnzipFile,执行时请选择当前项目中引入该库的模块。
此步骤仅需执行一次即可完成初始化。
但假如 java-all-call-graph 升级后,若对配置文件有新增或修改,则需要再执行当前步骤,否则可能会因为缺少配置文件导致执行失败
该类的作用是将 java-all-call-graph 项目的入口类和相关配置文件,以及 java-callgraph2 项目的配置文件解压释放到指定目录。
释放根目录的选择遵循以下优先级顺序:
java-all-call-graph 的入口类会被写入释放根目录下的 java/test/jacg 路径中,其配置文件则保存至根目录下的 resources/ 目录,子目录名称为:
_el_example
或以以下形式命名的子目录:
_jacg_
而 java-callgraph2 项目的配置文件同样存放在 resources/ 目录下,子目录名为:
_el_example
或以如下前缀开头的目录:
_javacg2_
完成配置文件的参数修改后,即可运行相应的入口类来启动程序。
此方式的操作说明与“通过 IDE 打开项目源码运行”部分一致,可参照相同流程进行处理。
进入项目根目录,并执行如下命令进行构建:
gradlew gen_run_jar
构建成功后,将在项目根目录生成名为 jar_output_dir 的文件夹,其中包含以下子目录与文件:
| 目录/文件名 | 用途说明 |
|---|---|
| _el_example | 存放表达式相关的示例及说明文档 |
| _javacg2_xxx | 用于保存当前项目所使用的配置文件 |
| config | log4j2 日志框架的配置文件存储位置 |
| jar | 存放项目编译后生成的 jar 文件 |
| lib | 项目依赖的第三方库 jar 文件所在目录 |
| log | 日志文件存储目录,运行后会自动生成日志内容 |
| xxx.bat | 适用于不同场景的 Windows 执行脚本 |
| xxx.sh | 适用于不同场景的 Linux/Unix 执行脚本 |
在完成对配置文件中的各项参数调整后,可通过执行对应的 xxx.bat(Windows)或 xxx.sh(Linux/Unix)脚本来调用指定的入口类,从而启动应用。
更多关于通过编码方式调用的使用案例,请参见:
通过代码执行的其他示例
更新说明
扫码加好友,拉您进群



收藏
