Java打印对象需重写toString()或用JSON库:手动/IDE生成toString()要处理null、剔除敏感字段;JSON(Jackson/Gson)适合日志/API,需防循环引用;日志中应延迟求值避免性能问题。

Java 中打印对象详细信息,核心是让对象“说清楚自己是谁、有什么”,而不是只显示一串类似 Person@1b6d3586 的无意义地址。默认行为不满足调试和日志需求,必须主动干预。
重写 toString() 方法(最常用、最直接)
每个类都继承自 Object,其默认 toString() 只返回 类名@哈希值。重写它,就能控制打印内容:
- 手动编写:在类中添加
@Override public String toString(),用字符串拼接字段,注意对null值做判断,避免空指针异常 - 用 IDE 自动生成:IntelliJ IDEA 中右键 → Generate → toString(),推荐选 Custom 模板,并勾选 Use 'java.util.Objects.toString()',它会自动处理
null - 关键细节:生成后务必检查——敏感字段(如 password、token)要手动删掉;新增或删除成员变量后,需重新生成,否则输出内容会遗漏或过时
用 JSON 库转成结构化字符串(适合日志、API、跨系统)
当需要清晰层级、易解析、兼容性好时,toString() 手写容易出错且难维护,JSON 是更规范的选择:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- Jackson(主流):引入
jackson-databind,用ObjectMapper.writeValueAsString(obj)即可 - Gson(轻量友好):引入
gson,用new Gson().toJson(obj),对泛型擦除更宽容 - 注意避坑:对象含循环引用(A→B→A)会报
Infinite recursion;敏感字段需加@JsonIgnore;时间类型建议配置序列化格式(如ISO_LOCAL_DATE_TIME)
日志中安全打印对象(别让 toString 拖垮性能)
在 SLF4J / Logback 等日志框架中,看似简单的 log.debug("user: {}", user) 隐含风险:
立即学习“Java免费学习笔记(深入)”;
- 如果
user.toString()里做了数据库查询、远程调用或复杂计算,哪怕日志级别关闭,这些操作仍会执行 - 推荐做法:用延迟求值,例如
log.debug("user: {}", () -> user.toJsonString())(SLF4J 2.0+ 支持),或显式判断if (log.isDebugEnabled()) { log.debug("user: {}", user.toJsonString()); } - 绝对不要在
toString()方法里做 IO、锁、耗时逻辑——它可能被任意线程、任意时机(比如监控线程 dump)调用
其他辅助方式(按需选用)
不是所有场景都需要完整字段,有时只需快速验证或局部观察:
- 定义专用打印方法:如
public void printDetails(),只输出调试关心的几个字段,不参与通用逻辑 - 用反射工具类(如 Apache Commons Lang 的
ToStringBuilder.reflectionToString(obj)),适合临时调试,但生产环境慎用(性能开销大、字段不可控) - 单元测试中配合断言:重写
toString()后,assertEquals(expected, actual.toString())更直观


















