# code_analysis **Repository Path**: wangchen24/code_analysis ## Basic Information - **Project Name**: code_analysis - **Description**: 代码影响分析 反向调用链追踪 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-20 - **Last Updated**: 2025-10-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 反向调用链追踪代码影响分析器 这是一个强大的Java代码分析工具,能够通过反向调用链追踪的方式分析代码影响范围。当您指定一个目标方法(如`RedisUtil.set`)时,该工具会自动找到所有调用该方法的接口路径,并获取接口的详细描述。 ## 功能特性 ### 🔍 反向调用链追踪 - **多层调用分析**:支持方法A调用方法B,方法B调用目标方法的复杂调用关系 - **智能匹配**:支持模糊匹配和精确匹配目标方法 - **循环检测**:自动避免循环调用导致的无限递归 ### 📊 接口信息提取 - **Spring MVC支持**:自动识别`@Controller`、`@RestController`等注解 - **请求映射解析**:支持`@RequestMapping`、`@GetMapping`、`@PostMapping`等注解 - **Swagger文档**:自动提取`@ApiOperation`中的接口描述 - **完整路径构建**:自动组合类级别和方法级别的请求路径 ### 🎯 可视化输出 - **调用链展示**:以树形结构展示完整的调用链路 - **影响统计**:统计受影响的接口数量和调用链数量 - **详细信息**:显示每个接口的HTTP方法、路径和描述 ## 项目结构 ``` src/main/java/ ├── MethodImpactAnalyzer.java # 主分析器类 ├── com/example/ │ ├── util/ │ │ └── RedisUtil.java # 目标工具类(示例) │ ├── service/ │ │ ├── UserService.java # 用户服务(示例) │ │ └── OrderService.java # 订单服务(示例) │ └── controller/ │ ├── UserController.java # 用户控制器(示例) │ └── OrderController.java # 订单控制器(示例) ``` ## 使用方法 ### 1. 配置目标方法 在`MethodImpactAnalyzer.java`中修改以下配置: ```java // 目标方法名(支持模糊匹配和完整匹配) private static String TARGET_METHOD_NAME = "RedisUtil.set"; private static String TARGET_CLASS_NAME = "RedisUtil"; // 可选:指定目标类名 // 项目路径和包名 private static String PROJECT_SOURCE_ROOT = "D:/ideaWorkSpacs/untitled/src/main/java"; private static String BASE_PACKAGE = "com.example"; ``` ### 2. 运行分析 ```bash # 编译项目 mvn compile # 运行分析器 mvn exec:java -Dexec.mainClass="MethodImpactAnalyzer" ``` ### 3. 查看结果 分析器会输出以下信息: ``` === 反向调用链追踪代码影响分析器 === 目标方法: RedisUtil.set 项目路径: D:/ideaWorkSpacs/untitled/src/main/java 基础包名: com.example 第一阶段:构建方法调用图... 方法调用图构建完成,共发现 15 个方法 Controller方法数量: 6 第二阶段:反向追踪调用链... 找到目标方法数量: 1 追踪目标方法: com.example.util.RedisUtil.set 第三阶段:生成影响分析报告... === 反向调用链追踪分析结果 === 目标方法: RedisUtil.set 发现调用链数量: 4 📋 调用链 #1: 调用路径: com.example.util.RedisUtil.set -> com.example.service.UserService.cacheUserInfo -> com.example.controller.UserController.cacheUserInfo 影响的接口: 🔗 POST /api/users/cache - 缓存用户信息 📋 调用链 #2: 调用路径: com.example.util.RedisUtil.set -> com.example.service.UserService.cacheUserInfo -> com.example.service.UserService.updateUserStatus -> com.example.controller.UserController.updateUserStatus 影响的接口: 🔗 PUT /api/users/status - 更新用户状态 📊 统计信息: 调用链总数: 4 受影响接口总数: 6 目标方法: RedisUtil.set 🎯 所有受影响的接口列表: POST /api/users/cache - 缓存用户信息 PUT /api/users/status - 更新用户状态 POST /api/users/orders - 创建用户订单 POST /api/orders/create - 创建订单 DELETE /api/orders/cancel - 取消订单 ``` ## 示例场景 ### 场景1:直接调用 ```java // UserService.java public void cacheUserInfo(String userId, String userInfo) { RedisUtil.set("user:" + userId, userInfo); // 直接调用目标方法 } // UserController.java @PostMapping("/cache") public String cacheUserInfo(@RequestParam String userId, @RequestParam String userInfo) { userService.cacheUserInfo(userId, userInfo); // 调用UserService return "用户信息已缓存"; } ``` **调用链**:`UserController.cacheUserInfo` → `UserService.cacheUserInfo` → `RedisUtil.set` ### 场景2:间接调用 ```java // UserService.java public void updateUserStatus(String userId, String status) { String userInfo = "status:" + status; cacheUserInfo(userId, userInfo); // 间接调用 } // UserController.java @PutMapping("/status") public String updateUserStatus(@RequestParam String userId, @RequestParam String status) { userService.updateUserStatus(userId, status); // 调用UserService return "用户状态已更新"; } ``` **调用链**:`UserController.updateUserStatus` → `UserService.updateUserStatus` → `UserService.cacheUserInfo` → `RedisUtil.set` ## 配置说明 ### 目标方法匹配规则 1. **类名匹配**:如果指定了`TARGET_CLASS_NAME`,会匹配包含该类名的方法 2. **方法名匹配**:匹配包含`TARGET_METHOD_NAME`的方法 3. **完整匹配**:匹配包含完整方法签名的调用 ### 支持的注解 - **Controller注解**:`@Controller`、`@RestController` - **请求映射注解**:`@RequestMapping`、`@GetMapping`、`@PostMapping`、`@PutMapping`、`@DeleteMapping`、`@PatchMapping` - **API文档注解**:`@ApiOperation`、`@Api` ### 性能优化 - **最大深度限制**:默认最大调用链深度为10,防止无限递归 - **循环检测**:自动检测并避免循环调用 - **包过滤**:只分析指定包下的代码,提高分析效率 ## 扩展功能 ### 自定义匹配规则 可以通过修改`isTargetMethod`方法来实现自定义的匹配规则: ```java private static boolean isTargetMethod(MethodInfo method) { // 自定义匹配逻辑 return method.getMethodName().contains("cache") || method.getClassName().contains("Redis"); } ``` ### 输出格式定制 可以通过修改`printResults`方法来自定义输出格式,支持: - JSON格式输出 - HTML报告生成 - CSV数据导出 ## 注意事项 1. **项目路径配置**:确保`PROJECT_SOURCE_ROOT`指向正确的源码目录 2. **包名过滤**:`BASE_PACKAGE`用于过滤分析范围,提高性能 3. **依赖解析**:当前版本使用简化的方法调用解析,复杂场景可能需要更精确的类型解析 4. **内存使用**:大型项目分析时注意内存使用情况 ## 技术实现 - **JavaParser**:用于Java源码解析和AST分析 - **访问者模式**:遍历AST节点收集方法调用信息 - **图算法**:构建方法调用图并进行反向追踪 - **Spring注解解析**:识别和解析Spring MVC相关注解 这个工具特别适用于: - 代码重构前的影响分析 - API变更的兼容性检查 - 系统架构梳理 - 代码依赖关系分析