Java反射获取字段值需先用getDeclaredField获取字段,调setAccessible(true)设为可访问,再用Field.get(obj)读取;静态字段传null,实例字段传对应实例,注意异常处理和类型转换。

Java中通过反射获取对象属性字段值,核心就是用 Field.get() 方法。但直接调用它前,必须确保字段可访问(尤其是私有字段),且传入正确的对象实例。
确认字段已正确获取
先用 Class.getDeclaredField("fieldName") 获取字段对象,注意:
- 要用
getDeclaredField而非getField,后者只查 public 字段,不支持 private/protected - 字段名必须完全匹配(大小写敏感),不能是 getter 方法名
- 如果字段在父类中,需向上遍历父类 Class 才能拿到
设置字段为可访问
对 private、protected 或 package-private 字段,必须调用 setAccessible(true),否则会抛 IllegalAccessException:
Field field = clazz.getDeclaredField("name");
field.setAccessible(true); // 关键一步
Object value = field.get(obj); // 此时才能安全读取
调用 get() 传入正确目标对象
Field.get(Object obj) 的参数 obj 是字段所属的实例:
立即学习“Java免费学习笔记(深入)”;
- 静态字段(
static)传null即可 - 实例字段必须传对应类的实例对象,传错类型或 null 会抛
IllegalArgumentException或NullPointerException - 若字段类型是基本类型(如 int),返回的是包装类(Integer),可用
field.getType().isPrimitive()判断是否需拆箱
处理异常和类型转换
实际使用中建议捕获常见异常,并按需转换类型:
-
NoSuchFieldException:字段名不存在 -
IllegalAccessException:忘了调setAccessible(true)或安全策略限制 -
IllegalArgumentException:传入的 obj 不是该字段声明类或其子类的实例 - 拿到 Object 返回值后,可用
(String) value强转,或用field.getType().cast(value)更安全


















