从重复劳动到智能助手:我为什么要开发一个 JavaDoc 插件
从重复劳动到智能助手:我为什么要开发一个 JavaDoc 插件
dong4j现有方案的痛点
写 JavaDoc 是一件所有人都觉得该做、但没人愿意做的事。CI/CD 检查会因为缺少文档卡你,Code Review 会因为文档质量不行打回,但真要写的时候,你发现这完全是重复劳动——方法签名已经告诉你参数和返回值,方法体就在眼前,你只是用自然语言复述一遍代码本身就能表达的信息。
市面上的自动生成工具要么只给你空壳模板(@param userId the user id),要么需要你切换到命令行或者外部工具,打断开发流程。而直接用 ChatGPT 或者 Cursor,虽然能生成不错的文档,但每次都要手动复制代码、切换窗口、等结果再贴回来,而且通用 AI 工具加载了大量 Agent、MCP、Skill 上下文,你只是想给一个方法加个文档,也要消耗大量 token。
这个问题的核心其实很简单:输入是光标所在的代码元素,输出是格式化的 JavaDoc 注释,一轮问答就够了。用最轻量的 AI 调用嵌入 IDE,不离开编辑器,不多消耗一个 token,这就是这个插件要做的事。
功能一览
| 功能 | 入口 | 说明 |
|---|---|---|
| 生成 JavaDoc | Alt+Enter / 快捷键 / 右键菜单 | 为光标所在的类、方法、字段生成文档 |
| 修复已有注释 | FIX 模式 | 保留原注释发给 AI,只修正错误或补充缺失部分 |
| CodeVision 行内提示 | 编辑器行内 | 缺少文档的元素显示”Generate Javadoc”提示,点击即生成 |
| 保存时自动生成 | 文件保存触发 | 保存时自动为改动范围内的元素补充文档,不影响保存速度 |
| Git 提交时检查 | 提交页面 | 提交前扫描缺失文档,提示批量补全 |
| 删除 Javadoc | Intention Action | 一键删除元素的 Javadoc 注释 |
支持 Java 和 Kotlin,通过 IntelliAI Engine 统一调用 OpenAI、Anthropic、Ollama 等多种 AI 后端。
和其他方案比,好在哪
vs 空壳模板工具:不只是填充模板。插件通过 PSI 分析代码结构和业务语义,AI 看到的是带上下文的代码,生成的文档有实际意义,不是 @param userId the user id 这种废话。
vs 通用 AI 工具(ChatGPT、Cursor 等):
- Token 消耗低一个数量级。插件会对代码做压缩预处理,不是把整个文件原样扔给 AI
- 无缝集成在 IDE 里,光标定位 → Alt+Enter → 出结果,不需要切换窗口
- 支持多服务商并行生成,批量处理几十个文件不会卡住
- 模板和标签完全可定制,生成风格和格式可控
vs 其他 AI JavaDoc 插件:
- **不是”生成就完了”**:AI 返回的文本会经过多层后处理——过滤多余的 Markdown 代码块、根据方法签名清理 AI 错误添加的
@param/@throws标签、中英文之间自动加空格、中文标点转英文标点、单行注释自动压缩 - 不只是手动触发:CodeVision 行内提示、保存时自动生成、Git 提交时检查,覆盖了开发流程中的每一个文档需求时机
- **不只是”覆盖重写”**:FIX 模式下保留原注释让 AI 只修正错误,不会丢失人工编写的有价值内容
- PSI 语义分析:不是把代码原样扔给 AI,而是分析架构位置、职责、依赖关系,注入结构化上下文
核心:怎么让 AI 理解你的代码并生成准确的文档
用 AI 生成 JavaDoc 看起来简单,但要做好很难。直接把 element.getText() 扔给 AI 不行,原因有三:
- 代码太长:一个复杂类可能几百上千行,全部发过去 token 浪费严重
- 缺少上下文:单个方法的代码是孤立的,AI 不知道这个方法属于哪个类、被谁调用、在架构中扮演什么角色
- 噪音干扰:注释、空行、格式化代码占据了大量篇幅,对生成文档没有帮助
插件围绕这三个问题做了多层优化。
代码压缩
对发给 AI 的代码做预处理,去掉对文档生成无用的内容:
1 | // AiCodePreprocessor.java |
实际效果:一个 200 行的类,压缩后可能只有 60-80 行,token 消耗减少 60% 以上。而且因为去掉了噪音,AI 生成的质量反而更高。
类级上下文注入
生成方法或字段的文档时,AI 需要知道这个元素在类中的位置。插件会在方法/字段代码前注入压缩后的类代码片段作为上下文:
1 | // TaskCollector.java - buildClassCodeContext() |
AI 看到的 prompt 结构是这样的:
1 | ### 类级上下文(仅供参考,不直接生成注释) |
这样 AI 既能理解方法所属的类和上下文,又不会把类级代码也生成注释。
PSI 语义分析
这是插件和”直接把代码扔给 AI”最本质的区别。插件通过 IntelliJ PSI 接口分析类的语义信息,注入给 AI 的不是裸代码,而是带有语义标注的结构化数据:
1 | // ClassSemanticAnalyzer.java |
这些语义信息会被组装成结构化的 prompt 注入给 AI:
1 | ### 语义上下文 |
AI 拿到这些信息后,生成的 JavaDoc 不会再是泛泛的描述,而是能准确反映类在架构中的位置、职责和设计意图。
不同元素类型的差异化处理
插件不会用同一个模板处理所有元素。根据元素类型(类、方法、字段、测试方法)使用不同的 prompt 模板,覆写模式也有区分:
1 | // AIRequestComposer.java |
修复已有注释(FIX 模式)
不只是”没有注释才生成”。当元素已有 Javadoc 时,插件提供两种覆写模式:
- FIX:保留原注释发给 AI,用专门的修复提示词让 AI 只修正错误或补充缺失信息。不会丢失人工编写的有价值内容
- REPLACE:删除原注释,让 AI 从头生成
1 | // AIRequestComposer.java |
AI 响应后处理
AI 返回的文本不能直接插入代码。插件在插入前做了多层清洗:
过滤多余内容
AI 经常不听话——你说”只返回注释”,它偏要返回代码块或者把原始代码也带上:
1 | // DocumentationInserterHelper.java |
根据方法签名清理多余标签
AI 最常见的错误:给没有参数的方法加上 @param,给 void 方法加上 @return,给字段加上 @throws。插件会根据实际的 PSI 方法签名做校验:
1 | // DocumentationInserterHelper.java - cleanParamAndThrowsTags() |
这个校验是基于 PSI 的精确判断,不是字符串匹配。
中英文之间自动加空格
AI 生成的中文文档里,中英文混排时经常没有空格,读起来很不舒服。插件集成了 Pangu 排版工具,自动在中文和英文/数字之间插入空格:
1 | // 处理前 |
这个处理是可配置的,在设置中可以开关。
中文标点转英文标点
同样的,AI 生成的文档里标点符号风格不统一。插件可以将中文标点(,、。、(、))替换为英文标点(,、.、(、)),保持 Javadoc 标点风格一致。
1 | // DocumentationInserterHelper.java - formatJavaDocContent() |
两项处理都是可配置的,用户可以根据团队规范自由开关。
单行注释压缩
当 Javadoc 只有一行描述、没有 @param/@return 等标签时,插件会自动把三行格式压缩为单行:
1 | // 压缩前(3行) |
压缩条件:内容只有一行非空文本、不包含 Javadoc 标签、长度不超过 120 字符。超过限制的不会压缩,避免一行太长影响阅读。
IDE 深度集成
CodeVision 行内提示
在编辑器中,缺少 Javadoc 的类、方法、字段会显示类似”x usages”的行内提示,写着”Generate Javadoc”。点击即可生成,不需要移动光标、不需要按快捷键。
对于已有注释的元素,提示会变成”Override Javadoc”(如果启用了覆盖模式)。CodeVision 提示完全遵循用户配置——只显示你选择要生成的元素类型(类/方法/字段),只在你选择的语言(Java/Kotlin)上生效。
为了不影响编辑器性能,CodeVision 计算做了多项优化:
- 快速检查在 UI 线程(
precomputeOnUiThread)完成,只做文件系统类型检查 - 慢操作(PSI 遍历、文件索引检查)放到后台线程的
ReadAction.nonBlocking中 - 串行处理,避免
parallelStream导致 IDEA 死锁 - 限制最大处理数量(50 个类、每个类 100 个方法/字段),防止大文件卡顿
保存时自动生成
开启后,每次保存文件时插件会自动检测改动范围内的方法和字段,只为它们补充 Javadoc。关键设计:
- 只处理改动的元素:通过
DocumentListener跟踪每次编辑的范围(RangeMarker),保存时只检查改动范围内的方法/字段,不是全文件扫描 - 不阻塞保存:生成在后台异步执行,保存操作本身不会被延迟
- 防重复触发:用
AtomicBoolean确保同一时间只有一个生成流程在运行 - 延迟 500ms 执行:避免与保存操作本身冲突
1 | // GenerateOnSaveListener.java |
Git 提交时检查
在 Git 提交页面,插件会扫描所有待提交的 Java/Kotlin 文件,检测缺失 Javadoc 的类、方法、字段,生成汇总报告(比如”检测到 3 个类、12 个方法缺少 Javadoc”),提示用户是否一键补全。
这个功能不依赖配置,专门用于提交前的文档完整性检查。它会强制检查所有类型的元素(类、方法、字段),忽略用户的 generateForClass/generateForMethod/generateForField 设置,确保提交的代码不会缺少文档。
多服务商并行生成
批量处理文件时(比如整个项目补文档),插件支持多服务商并行执行。把任务分配给多个已配置的 AI 服务商,同一个文件内的任务按顺序处理,不同文件的任务并行处理:
1 | // ParallelTaskExecutor.java |
配置了多个 AI 服务商时,生成速度随服务商数量线性提升。还可以在设置中查看每个服务商的统计信息(响应速度、成功率、token 消耗),方便选择最优服务商。
配置项
设置面板支持:
- AI 提供商:OpenAI、Anthropic、Ollama 等,可配置多个并设置优先级
- 模板定制:类、方法、字段、测试方法各自的 prompt 模板,包括修复已有注释的专用模板
- 系统提示词:调整 AI 的生成风格和语言偏好
- JavaDoc 标签:自定义 @author、@date、@version 等标签的默认值
- 代码压缩:启用/禁用代码预处理,控制压缩程度
- 语义上下文:启用/禁用 PSI 语义分析
- 类上下文行数:控制注入的类级上下文最大行数
- 中英文间距:启用/禁用 Pangu 自动排版
- 标点规范化:启用/禁用中文标点转英文标点
- 单行注释压缩:启用/禁用单行 Javadoc 压缩为一行
- CodeVision 提示:启用/禁用编辑器行内提示
- 保存时生成:启用/禁用保存时自动生成
- 语言支持:选择生成文档的语言(Java / Kotlin)
- 性能模式:启用多服务商并行处理,查看各服务商统计
效率对比
| 场景 | 手动 | 插件 | 提升 |
|---|---|---|---|
| 简单方法 JavaDoc | 3-5 分钟 | 10-20 秒 | ~15x |
| 复杂方法 JavaDoc | 10-15 分钟 | 30-60 秒 | ~12x |
| 类级别 JavaDoc | 20-30 分钟 | 1-2 分钟 | ~15x |
| 批量处理 50 个文件 | 2-3 小时 | 10-15 分钟 | ~12x |
| 提交前文档检查 | 人工逐文件检查 | 一键扫描 + 批量补全 | - |
相关文章:
- IntelliAI Engine - 统一接入 30+ AI 服务商的底层平台
- IntelliAI Terminal - 终端自然语言生成 Shell 命令
- IntelliAI Changelog - AI 一键生成 Changelog、日报、周报
相关链接
- IntelliJ 插件市场: https://plugins.jetbrains.com/plugin/intelliai-javadoc
- GitHub: https://github.com/dong4j/zeka-stack
- IntelliAI Engine: https://github.com/dong4j/zeka-stack/tree/main/intelli-ai-engine
- Javadoc 开发文档: https://ideaplugin.dong4j.site/javadoc/docs.html



















