上周部门聚餐,新来的应届生小刘端着酒杯凑过来:"哥,听说你以前一天写一千行代码,现在怎么天天下午四点就走了?是躺平了吗?"
我笑了笑,没说话。
其实我不仅没躺平,活还越接越多——上个月我一个人干了三个项目的核心模块,还没加过一天班。
秘诀是什么?
我把AI变成了我的"Java编程副驾驶"。
从需求分析、代码编写、单元测试、Bug修复、性能优化,到代码审查、文档编写——Java开发生命周期的每一个环节,AI都在背后给我撑着。
今天就把这套"AI驱动的Java开发完全指南"全盘托出。不管你是刚入行的Java新手,还是干了十年的老鸟,这篇都能让你少加一半班。
一、先定调子:AI在Java开发中的"六层定位"
很多人以为"用AI写Java"就是把需求扔给AI,等它吐出一堆代码。这是最外行的用法。
我的理解是:AI在Java开发中,扮演了六个不同层级的角色。
text
第一层【翻译官】:把需求/伪代码/其他语言转成Java
第二层【填空题】:写样板代码、CRUD、工具类
第三层【调试器】:分析报错堆栈、找Bug根因
第四层【代码审查员】:指出代码坏味道、安全隐患
第五层【架构顾问】:提供设计思路、选型建议
第六层【文档助手】:写注释、写接口文档、写README你越清楚自己当前需要哪个层级的"AI角色",Prompt就越精准,AI输出的质量就越高。 下面一个一个来讲。
二、第一层:AI当"翻译官"——把需求变成Java代码
这是最基础、也最常用的场景。但很多人用错了方法——直接说"帮我写个订单系统",AI吐出来的代码根本不能用。
我的标准操作流程:
第一步,把模糊需求变成"结构化输入"。 我一般这样写Prompt:
"我要开发一个订单管理的Java模块,请帮我生成核心代码。
【业务规则】
- 订单状态:待支付→已支付→已发货→已完成,支持取消(仅待支付状态可取消)
- 下单时需校验库存,扣库存失败则订单创建失败
- 支付成功后发送MQ消息通知物流系统
【技术栈】Spring Boot 3.2 + MyBatis-Plus + Redis + RocketMQ
【输出要求】
1. 完整的实体类(含Lombok注解)
2. Service层接口和实现类(核心业务逻辑)
3. Controller层(RESTful API)
4. 枚举类(订单状态)
5. 全局异常处理(业务异常统一封装)
请直接输出代码,不要解释。"
AI十几秒输出了一套完整的代码骨架——Entity、Service、Controller、枚举、异常类全都有了。我需要做的就是补充MyBatis-Plus的Mapper细节和具体的SQL。
踩坑提示: AI生成的代码里,业务规则校验(比如状态流转合法性)有时候不完整。比如它可能忘了"已支付状态不能再次支付"这种校验。所以拿到代码后,第一件事就是检查所有if和switch分支,确保业务规则都覆盖了。
三、第二层:AI当"填空题"——专治各种样板代码
Java开发最耗时的不是写业务逻辑,而是写那些"不写不行、写了又没技术含量"的样板代码。比如:
- 实体类的getter/setter/toString(虽然Lombok能解决一部分)
- DTO和Entity之间的转换(BeanUtils.copyProperties还得手动处理嵌套对象)
- 分页查询的Wrapper构造
- Excel导入导出的解析逻辑
- 各种工具类(日期处理、加密解密、文件操作)
这些活,AI干得又快又好。
比如我要写一个DTO转换器,Prompt:
"把OrderEntity转成OrderDTO,字段映射如下:
entity.orderNo → dto.orderNumber
entity.createTime → dto.createdAt(格式化'yyyy-MM-dd HH:mm:ss')
entity.orderItems (List<OrderItemEntity>) → dto.items (List<OrderItemDTO>),需要递归转换
entity.payTime如果为null,dto.payStatus返回'未支付',否则'已支付'
*
写一个Converter工具类,用Java 8 Stream + 函数式编程实现。"
AI输出的Converter类,连null安全的处理都帮我写好了。以前写这种东西要10分钟,现在10秒钟。
四、第三层:AI当"调试器"——专治各种疑难杂症
写了这么多年Java,我见过最恶心的报错是这两类:
第一类:Spring Boot启动失败,报一大串bean依赖循环。
┌─────┐| orderService defined in file [OrderService.class]↑ ↓| userService defined in file [UserService.class]└─────┘
我盯着这个环形依赖看了半天,没理清谁依赖谁。直接复制堆栈扔给AI:
"Spring Boot启动报循环依赖,堆栈如上。帮我分析依赖链,并给出两种以上解决方案。当前代码片段:[粘贴@Autowired相关代码]"
AI秒回:
"依赖链:OrderService → UserService → OrderService(通过OrderService的某个方法间接调用了UserService,而UserService又反向调用了OrderService)。
解决方案一(推荐):在其中一个依赖上使用@Lazy,延迟加载打破循环。
解决方案二:抽取共同依赖的代码到第三个Service中。
解决方案三:重构设计,避免双向依赖(最优但改动大)。
根据你的代码,方案一最简单:在OrderService的@Autowired UserService上加上@Lazy即可。"
加了@Lazy,项目秒起。
第二类:空指针地狱。
AI最喜欢干的事就是帮你找出所有可能返回null的地方,然后帮你改成Optional链式调用。我现在的习惯是:写完一段可能涉及多层对象取值的代码,先让AI"扫描"一遍NPE风险。
比如这段代码:
java
String city = user.getAddress().getCity().getCityName();AI会直接标红:
"高危NPE风险: user.getAddress() 可能为null、getCity() 可能为null、getCityName() 可能为null。
建议改用:
java
String city = Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .map(City::getCityName) .orElse("未知"); ```"
现在我的代码里,Optional的使用率比一年前高了十倍,NPE相关的线上Bug降了80%。
五、第四层:AI当"代码审查员"——不给同事留喷你的机会
我以前提MR,最怕架构师在评论里写:"这段代码考虑过并发场景吗?""这个异常吞掉是认真的吗?"
现在我学乖了:在提交MR之前,先把代码发给AI审一遍。
我的审查Prompt是:
"请审查以下Java代码,从五个维度输出意见:
1. 空指针风险
2. 线程安全(共享变量、并发集合)
3. 资源泄漏(流、连接是否关闭)
4. 异常处理(是否合理、是否吞异常)
5. 性能问题(循环里查数据库、N+1查询、大对象占用)
按'严重 🔴'、'一般 🟡'、'建议 🟢'分级输出。"
有一次AI审查我的一段"批量导出Excel"代码,指出:
"🟡 一般问题: for循环里每生成一行数据就调用一次workbook.write(),数据量大的时候IO开销很大。建议改为:先在内存中构建完整数据列表,最后一次性写入。"
我改了之后,导出10000条数据的耗时从12秒降到了3秒。这个优化我自己Review的时候根本没意识到。
六、第五层:AI当"架构顾问"——选型、设计、重构一把抓
当你面对一个技术选型或架构决策时,AI的价值甚至比写代码更大。
有一次我要做一个"延迟任务"的功能——用户下单30分钟未支付自动取消。我纠结是用@Scheduled定时扫表,还是用RocketMQ的延迟消息,还是用Redisson的分布式延迟队列。
我把三种方案的优缺点列出来,扔给AI:
"我要实现订单30分钟未支付自动取消,日订单量约10万。三种方案:
A. 定时任务每分钟扫表(@Scheduled)
B. RocketMQ延迟消息(delay level)
C. Redisson RDelayedQueue
*
请帮我做技术选型,从以下几个维度对比:实现复杂度、可靠性、性能、运维成本、扩展性。"
AI输出了一张对比表:
方案 | 复杂度 | 可靠性 | 性能 | 运维成本 | 推荐 |
定时扫表 | ⭐⭐ | ⭐⭐(有延迟) | ⭐⭐⭐(依赖DB) | ⭐ | 不推荐(10万量级扫表太费) |
RocketMQ延迟 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 推荐(精准、可靠) |
Redisson队列 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | 备选(无MQ时可考虑) |
然后我按AI的建议选了RocketMQ,上线后稳如老狗。
重构场景也一样。 有一次我要重构一个"千年大泥球"类——1500行,十几个方法,各种if-else嵌套。我让AI帮我做"拆分解构":
"这个类有1500行,承担了太多职责。请帮我分析如何拆分,按单一职责原则给出重构方案,用UML类图(Mermaid格式)展示拆分后的类结构。"
AI输出了拆分建议:OrderService → OrderValidator + OrderPriceCalculator + OrderStatusMachine + OrderEventPublisher。还顺便告诉我:"支付逻辑可以抽成策略模式,不同支付渠道(微信/支付宝/银行卡)各自实现。"
我照着改了,代码行数从1500降到了400,可维护性暴涨。
七、第六层:AI当"文档助手"——写注释、写接口文档
Java程序员最讨厌的几件事:写文档、写注释、写README。
但有了AI之后,这事变得无比轻松。
场景一:给一段代码自动生成JavaDoc。
我把一个复杂方法发给AI:
"给这段代码生成标准的JavaDoc注释,包含:功能描述、参数说明、返回值说明、异常说明、使用示例。"
AI输出的JavaDoc:
java
/**
* 根据订单ID和用户ID查询订单详情,并附带该订单的物流追踪信息
*
* @param orderId 订单ID(不能为空)
* @param userId 用户ID(用于权限校验)
* @return 订单详情DTO,包含订单基本信息、商品列表、物流信息;如果订单不存在或用户无权访问,返回null
* @throws IllegalArgumentException 当orderId或userId为null时抛出
* @throws SecurityException 当用户无权访问该订单时抛出
*
* @apiNote 该方法内部调用了订单服务、商品服务和物流服务,会产生3次数据库查询
* @see OrderService#getBaseOrder(String)
* @since 2.3.0
*/以前自己写这种注释要5分钟,现在AI 5秒。
场景二:生成接口文档(Swagger/OpenAPI注解)。
我把Controller方法发给AI:
"为这个接口生成Swagger 3的@Operation和@Parameter注解,包含中文描述、示例值、必填标识、枚举取值范围。"
AI输出了一整套@Schema和@ApiResponse注解。前端同事看了直呼专业。
八、AI在Java开发中的三大"致命短板"(血的教训)
短板一:AI不懂你的"私有依赖库"
公司内部的common包、自研的RPC框架、封装的工具类——AI一个都不认识。它生成的代码里,import com.company.common.util.DateUtil 这种内部类,全是红色波浪线。
应对方案: 把内部工具类的使用示例作为上下文喂给AI。比如:
"项目中使用了内部工具类DateUtil,用法是DateUtil.formatDate(date, "yyyy-MM-dd")。请基于此生成后续代码。"
短板二:AI对事务边界和锁粒度的判断经常不准
AI知道@Transactional,但它不知道你的业务里哪些操作应该在一个事务里、哪些应该拆分。它也不知道ReentrantLock应该锁在哪个粒度——锁太粗性能差,锁太细会出并发Bug。
应对方案: 涉及事务和锁的代码,AI只能提供"参考实现",最终的事务边界和锁粒度必须由熟悉业务的技术负责人把关。
短板三:AI会"幻视"不存在的API
Java的版本迭代快,AI的训练数据可能落后。比如它可能会生成java.util.Date.toInstant()(Java 8支持的),但如果你项目是Java 8以下,直接报错。
应对方案: 在Prompt里明确注明:"项目使用Java 11 + Spring Boot 2.7.5,请基于此版本生成代码。" 并且依赖版本号自己从pom.xml里确认。
九、我的"终极Java开发Prompt模板",直接复制
经过一年多的实践,这是我压箱底的万能Java开发Prompt模板:
markdown
【角色设定】
你是一个有12年Java开发经验的技术专家,精通Spring生态、并发编程、性能调优和系统架构设计。
【项目上下文】
- JDK版本:Java 17
- 框架版本:Spring Boot 3.2.0 / MyBatis-Plus 3.5.3 / Redis 7.0
- 项目模块:[简要描述项目是什么业务]
- 团队规范:[比如"使用Lombok、统一返回Result<T>、全局异常用@ControllerAdvice"]
【任务描述】
[具体要做什么:比如"实现一个订单状态变更的Service方法"]
【业务规则】
1. [规则1:比如"只有待支付状态的订单才能取消"]
2. [规则2:比如"取消订单需要释放库存"]
3. [规则3:比如"取消后发送MQ通知"]
【输出要求】
- 直接输出完整的、可运行的Java代码
- 包含必要的import语句
- 关键业务逻辑添加注释
- 异常情况要有明确的处理逻辑
- 如果涉及外部依赖,标注出需要引入的jar包
【约束条件】
- 不使用`Thread.sleep()`作为等待手段
- 不捕获异常后什么都不做(禁止空catch)
- 不使用过时的API(如Date的大部分方法)
- 数据库操作必须用MyBatis-Plus的Wrapper,不拼接SQL字符串
--- 以下是相关代码/上下文 ---
[粘贴现有的相关代码、表结构、接口定义等]十、最后说两句(掏心窝子版)
回到开头那个问题——"我是不是躺平了?"
我想说的是:这不是躺平,这是进化。
十年前,一个Java程序员的价值体现在"会写多少种设计模式""能背多少API""手写SQL有多快"。现在,这些东西AI全都会。
那Java程序员的真正价值在哪?
在于"判断AI写的代码对不对"、"把模糊的业务需求翻译成精确的指令"、"在AI给的三个方案里选出最适合当前场景的那个"、"在AI忽略的边缘case上做兜底"。
AI让"写代码"这件事的难度从"创造"降级到了"修改"。你的注意力应该从"怎么写"上升到"什么是对的""什么是最好的"。
用AI写Java,不是让你变懒,是让你把精力从低价值的"敲键盘"挪到高价值的"做决策"上。
最后送你一句话:
"未来的Java程序员,不是被AI取代的人,而是会用AI取代'重复劳动'的人。"
