Java反射实战:getFields与getDeclaredFields的深度避坑手册
在Spring Boot项目启动时突然抛出IllegalAccessException,或是自定义注解处理器漏掉了关键字段——这些看似诡异的Bug,往往源于对Java反射API中两个关键方法的误解。本文将带您穿透API文档的表面描述,直击实际开发中因误用getFields()和getDeclaredFields()引发的典型事故现场。
1. 从血泪案例看方法选择的致命差异
去年某电商平台大促期间,订单服务突然出现诡异的字段丢失问题。事后排查发现,开发团队在对象拷贝工具中误用getFields(),导致所有非public修饰的优惠券计算字段被静默忽略。这种错误在测试环境难以发现,因为测试数据大多使用基础类型字段。
1.1 权限控制失效的典型场景
考虑这样一个Spring AOP场景:需要动态拦截所有包含@Sensitive注解的字段进行脱敏处理。新手常见的错误实现是:
java复制Field[] fields = target.getClass().getFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Sensitive.class)) {
// 脱敏处理
}
}
这段代码会漏掉:
- 父类中非public的敏感字段
- 当前类中private/protected的敏感字段
- 接口中static final的常量字段
1.2 性能陷阱的真实代价
某金融系统在夜间批处理时出现性能劣化,监控显示字段遍历操作消耗了额外35%的CPU时间。根本原因是开发者在DTO转换时使用getFields()遍历了不必要的父类public字段,而实际上这些字段在业务场景中从未使用。
| 方法调用 | 平均执行时间(1000次) | 涉及字段数 |
|---|---|---|
| getFields() | 48ms | 15 |
