跳转至

Java 工具库

面试追问地图

主问题 必讲关键点 下一层追问
JSON 生态、兼容、安全、性能实测 未知字段、多态反序列化
Lombok 编译期注解处理、减少样板 equals、构造器、IDE 与升级
MapStruct 编译期生成、类型安全、无反射 更新映射、空值策略、循环引用
选型原则 维护性、边界、安全、可替换 封装与升级策略

一、序列化

Jackson 和 Fastjson2 如何选择?

两者都能完成 JSON 与 Java 对象转换。Jackson 在 Spring 生态中集成成熟、模块丰富;Fastjson2 可在既有阿里生态或经本业务基准验证的场景使用。不要只凭单一 benchmark 选型,应测试真实对象结构、吞吐、分配量、兼容策略和升级成本。

生产配置要明确:

  • 未知字段是忽略还是失败,关系到前后向兼容和拼写错误能否被发现。
  • 时间、金额、枚举和大整数的格式,必须由接口契约固定。
  • 多态反序列化会扩大可实例化类型范围,不应对不可信输入开放宽泛的自动类型机制。
  • ObjectMapper 完成配置后通常复用,不要每次请求重复创建;自定义模块应集中注册。

二、编译期代码生成

Lombok 解决了什么,又带来什么风险?

Lombok 通过编译期注解处理生成 getter、构造器、builder 等样板代码,不是运行时反射。收益是减少重复代码,代价是源码中看不到全部行为,且依赖编译器、IDE 插件和版本兼容。

常见风险包括:实体直接使用 @Data 生成不合适的 equals/hashCode/toString,关联对象递归输出,@Builder 与框架所需无参构造器冲突,以及升级 JDK 后注解处理不兼容。领域关键行为、可变实体的相等性和公开 API 更适合显式代码;排障时可用 delombok 查看生成结果。

MapStruct 为什么适合对象转换?

MapStruct 根据接口和注解在编译期生成普通 Java 映射代码,调用路径可读、类型错误能较早暴露,也没有通用反射映射的运行时开销。它适合 DTO、领域对象和持久化对象之间字段大体稳定的转换。

需要显式设计的点包括字段重命名、嵌套映射、空值策略、集合、枚举和循环引用。更新已有对象时可使用 @MappingTarget;但“空值表示忽略”还是“空值表示清空”必须按 PATCH/PUT 语义配置,不能依赖默认值猜测。

三、治理

工具库选型要检查什么?

  1. 是否确实减少复杂度,而不是给简单 JDK 能力再包一层。
  2. 维护状态、许可证、漏洞响应和 JDK/框架兼容范围。
  3. 是否进入协议、持久化格式或公共 API;一旦进入,替换成本会显著升高。
  4. 失败语义、线程安全、资源释放和边界数据是否清楚。
  5. 用最小封装隔离易变实现,但不要创造只转发一次调用的“万能工具类”。

参考资料