要实现最严谨的 Java 代码审核,不能仅依赖单一句子,而必须构建一个结构化、分阶段、上下文感知的提示词(Prompt)体系。核心策略是采用“角色设定 +多维检查清单 + 思维链(CoT)+ 强制输出规范”的组合模式 。
以下是经过深度优化的终极 Java 代码审核提示词模板及其使用方案。
1. 核心提示词模板(直接复制可用)
此模板设计为“系统级指令”,适用于 Claude 3.5 Sonnet, GPT-4o, 或本地部署的 Qwen-Coder 等大模型。它强制 AI 扮演资深架构师角色,并从六个维度进行深度扫描 。
# Role 你是一位拥有 20 年经验的 Java 首席架构师及安全专家,精通《Effective Java》、Oracle 安全编码规范、Spring Framework 最佳实践及高并发系统设计。你的任务是进行“零容忍”级别的代码审查(Code Review)。 # Context 我将提供一段 Java 代码片段。你需要忽略表面的格式问题(假设已由 Checkstyle/Prettier 处理),专注于深层逻辑、安全性、性能瓶颈及可维护性风险。 # Audit Dimensions (必须严格执行的检查清单) 1. **安全性 (Security)**:检查 SQL 注入、XSS、CSRF 风险。 -验证敏感数据是否硬编码或未加密存储。 检查异常处理是否泄露堆栈信息或掩盖关键错误。 - 确认权限校验逻辑是否存在绕过可能 。 2. **并发与线程安全 (Concurrency)**: - 识别竞态条件 (Race Conditions)、死锁风险。 - 检查集合类在多线程环境下的安全性 (如 HashMap vs ConcurrentHashMap)。 验证锁的使用粒度及 `volatile`/`synchronized` 的正确性。 3. **性能与资源管理 (Performance)**:检测 N+1 查询问题、大对象内存泄漏、未关闭的 IO 流/数据库连接。 - 分析时间复杂度,指出潜在的 O(n^2) 或更差的操作。 - 检查字符串拼接是否在循环中发生 (应使用 StringBuilder)。 4. **健壮性与异常处理 (Robustness)**: - 拒绝空的 catch 块或泛化的 `catch (Exception e)`。 - 验证空指针防护 (Optional 使用或显式判空)。 - 检查事务边界 (@Transactional) 是否合理,是否存在事务失效场景。 5. **代码规范与设计模式 (Design & Standards)**:违反 SOLID 原则的代码结构。 - 魔法数字 (Magic Numbers) 未提取为常量。 - 过度耦合或缺乏必要的接口抽象。 6. **JDK 版本兼容性**: - 确认使用的 API 是否符合声明的 JDK 版本 (如 Java 8 vs Java 17/21)。 # Workflow (思维链要求) 请按照以下步骤逐步思考并输出,严禁跳过任何步骤: 1. **代码意图重构**:用一句话总结这段代码试图解决的核心业务问题。 2. **逐行深度扫描**:在内部模拟执行流程,标记所有潜在风险点。 3. **分级评估**:将发现的问题按 [CRITICAL], [HIGH], [MEDIUM], [LOW] 分级。 4. **修复方案生成**:对每个 [CRITICAL] 和 [HIGH] 问题,提供重构后的代码片段。 # Output Format (严格遵循) 请以 Markdown 表格形式输出审核报告,随后提供修复代码。 ## 🛡️ 代码审核报告 | 严重等级 | 问题类别 | 行号/位置 | 问题描述 | 潜在后果 | 修复建议 | | :--- | :--- | :--- | :--- | :--- | :--- | | [CRITICAL] | 安全 | Line 45 | SQL 拼接使用 `+` 号 | 数据库被注入攻击 | 改用 PreparedStatement | | [HIGH] | 并发 | Line 88 | 非线程安全集合共享 | 数据不一致/丢失 | 替换为 ConcurrentSkipListMap | | ... | ... | ... | ... | ... | ... | ## 💡 核心重构代码 ```java // 在此处提供完整的、可运行的修复后代码// 必须包含详细的中文注释解释修改原因⚠️ 架构师特别提示
(在此处补充任何表格无法涵盖的系统级建议,如缓存策略、数据库索引优化等)# Input Code
[在此处粘贴你的 Java 代码]
### 2. 进阶策略:Prompt Chaining (提示词链) 对于复杂的企业级项目,单次提示词可能受限于上下文窗口或注意力分散。最严谨的做法是将审核任务拆解为**串联工作流**,利用“提示词链”技术提升准确率 。 #### 第一阶段:静态分析与规范检查 先让 AI 充当“编译器 + Linter”,只关注语法、规范和基础逻辑错误。 > **Prompt 片段**: "仅检查语法错误、未使用的导入、违反 Google Java Style 的格式问题以及基础的 NullPointer 风险。不要分析业务逻辑。" #### 第二阶段:安全与并发深度审计 将代码再次输入,专门针对安全漏洞和多线程问题进行“红队测试”。 > **Prompt 片段**: "假设你是黑客或高并发流量发生器。尝试找出这段代码中的 SQL 注入点、竞态条件、死锁风险及资源泄漏。忽略代码风格,只找致命漏洞。" #### 第三阶段:重构与优化 基于前两步的发现,生成最终的重构代码。 > **Prompt 片段**: "综合上述所有问题,重写该模块。要求:1. 使用 Java 17+ 特性 (如 Record, Switch Expression); 2.引入 Spring Security 最佳实践; 3. 确保线程安全。" ### 3. 实战案例演示 假设用户提交了一段存在风险的 DAO 层代码,AI 基于上述模板的输出示例如下: | 严重等级 | 问题类别 | 行号/位置 | 问题描述 | 潜在后果 | 修复建议 | | :--- | :--- | :--- | :--- | :--- | :--- | | [CRITICAL] | 安全 | Line 12 | 使用字符串拼接构建 SQL | 导致 SQL 注入,数据可被窃取或删除 | 必须使用 `JdbcTemplate` 的参数化查询或 MyBatis 的 `#{}` 占位符 | | [HIGH] | 资源 | Line 25 | `Connection` 未在 finally 块关闭 | 高并发下数据库连接池耗尽,服务宕机 | 使用 try-with-resources 语法自动管理资源 | | [MEDIUM] | 性能 | Line 30 | 在循环内调用远程 RPC | 网络延迟累积,接口响应时间呈线性增长 | 改为批量查询或在循环外并行调用 (CompletableFuture) | | [LOW] | 规范 | Line 5 | 魔法数字 "86400" | 代码可读性差,修改配置困难 | 提取为常量 `private static final int SECONDS_PER_DAY = 86400;` | **💡 核心重构代码** ```java @Service public class UserService { @Autowired private JdbcTemplate jdbcTemplate; /** * 修复说明: * 1. 使用 try-with-resources 确保 Connection 自动关闭,防止资源泄漏 。 * 2. 采用参数化查询 (?) 彻底杜绝 SQL 注入风险。 * 3. 移除魔法数字,使用具名常量。 */ public User getUserById(Long userId) { // 定义常量替代魔法数字 final String SQL_QUERY = "SELECT id, username, email FROM users WHERE id = ?"; try { // JdbcTemplate 内部已处理资源管理和异常转换,比原生 JDBC 更安全 return jdbcTemplate.queryForObject(SQL_QUERY, new Object[]{userId}, (rs, rowNum) -> { User user = new User(); user.setId(rs.getLong("id")); user.setUsername(rs.getString("username")); user.setEmail(rs.getString("email")); return user; }); } catch (EmptyResultDataAccessException e) { // 明确处理数据不存在的情况,避免返回 null 导致上游 NPE throw new ResourceNotFoundException("User not found with id: " + userId); } catch (DataAccessException e) { // 记录详细日志但不泄露堆栈给前端 log.error("Database error occurred for userId: {}", userId, e); throw new ServiceUnavailableException("Unable to access user service"); } } }4. 关键注意事项
- 上下文完整性:在发送代码前,务必告知 AI 项目的 JDK 版本、主要框架(如 Spring Boot 3.x)及构建工具(Maven/Gradle),否则 AI 可能会推荐不兼容的 API 。
- 敏感信息脱敏:严禁将真实的数据库密码、AWS Key 或核心商业逻辑代码直接发送给公有云 AI 模型。应在本地通过 IDE 插件(如通义灵码、Cursor)运行审核,或在发送前进行变量名混淆处理 。
- 人工复核机制:AI 生成的修复代码可能存在“幻觉”(引用不存在的库或方法)。所有 [CRITICAL] 级别的修改必须在本地编译并通过单元测试后方可合并 。
- 迭代优化:如果 AI 首次审核不够深入,可使用“追问”技巧:“请重新检查第 20 行的事务注解,如果在该方法内部调用了同类其他方法,事务会失效吗?”以此触发 AI 的深度推理能力 。
参考来源
- 代码审核AI来做
- AI的提示词专栏:Claude-2 Prompt 编写细节
- 大模型开发 - 41 审核模型:Spring AI 集成 OpenAI Moderation审核模型指南
- AI的提示词专栏:“Prompt Chaining”把多个 Prompt 串联成工作流
- 灵码+Qwen3-Coder,借助Skill机制实现高效代码审核实践探索