Java实体类的getter/setter必须为public,因框架依赖反射调用;若非public,Jackson等会静默跳过导致绑定失败;字段须private以保障封装与校验。

Java 实体类中属性的 getter 与 setter 方法,其访问修饰符必须统一为 public,这是 JavaBeans 规范的硬性要求,也是 Spring、Jackson、MyBatis 等主流框架能通过反射正常读写字段的前提。
为什么必须是 public?
框架在运行时依赖反射调用方法。若 getter/setter 不是 public,Class.getDeclaredMethod() 可能获取到方法,但 invoke() 会因访问权限失败;更常见的是,像 Jackson 的 ObjectMapper 或 Spring 的 BeanWrapper 会直接跳过非 public 方法,导致属性序列化/绑定静默丢失——不报错,但值为空或默认值。
- private / protected / package-private 的 getter/setter 无法被外部模块识别
- 即使本类内可调用,也违背封装意图:getter/setter 是对外暴露的“协议接口”,不是内部工具方法
- Lombok 的
@Getter/@Setter默认生成的就是 public 方法,不可配置为其他修饰符
属性本身必须是 private
实体类字段(如 private String userName;)必须声明为 private,这是封装的基础:
- 防止外部代码绕过校验直接赋值(如
user.userName = null;) - 确保所有写入都经过 setter 的参数检查与防御性拷贝逻辑
- 为未来扩展留余地(例如 getter 改为从缓存加载、setter 增加审计日志)
布尔类型 getter 的特殊处理
对于 boolean 原始类型字段(如 private boolean enabled;),getter 推荐使用 public boolean isEnabled(),而非 getEnabled():
立即学习“Java免费学习笔记(深入)”;
- 符合 JavaBeans 规范明确允许的 isXxx() 形式
- Jackson 默认只识别
isEnabled()绑定 JSON 中的"enabled": true -
Boolean包装类字段(如private Boolean archived;)应使用getArchived(),避免部分框架对 isArchived() 解析异常
不要在 getter/setter 中降级访问级别
常见错误写法需避免:
- ❌
protected String getName() { ... }—— Spring Boot 的 @ConfigurationProperties 绑定失败 - ❌
private void setCreateTime(LocalDateTime t) { ... }—— MyBatis 查询结果无法注入 - ❌ 字段 public + 手动删掉 getter/setter —— 完全失去封装,且框架无法操作
只要定义了字段,就该配一对 public 的访问器;若某字段真不需要外部访问,就别提供 getter/setter,而不是改修饰符。


















