Java反射中用Field.set()修改属性值需先获取Field对象并调用setAccessible(true)绕过访问控制,再传入目标实例和兼容类型值;static字段首参可为null,基本类型支持自动装箱,final字段JDK12+默认禁止修改。

Java 反射中用 Field.set() 修改对象属性值,核心是先获取 Field 对象,再绕过访问控制(如 private),最后调用 set() 赋值。关键点在于:字段可访问性、类型匹配、非静态字段需传入目标实例。
获取 Field 对象并设置可访问
通过类的 Class 对象获取指定名称的字段,无论 public/private/protected,默认不可直接操作私有字段,必须调用 setAccessible(true) 破除访问限制:
Field field = obj.getClass().getDeclaredField("fieldName");field.setAccessible(true); // 必须!否则 set() 会抛 IllegalAccessException
用 Field.set() 修改实例字段值
Field.set(Object obj, Object value) 中第一个参数是目标实例(不能为 null,除非是 static 字段),第二个参数是要设的值,类型需与字段兼容(自动装箱/拆箱支持,但不支持隐式类型转换):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 修改普通字段:
field.set(instance, "newString"); - 修改基本类型(如 int):
field.set(instance, 42);(自动装箱为 Integer) - 修改 static 字段:
field.set(null, "staticValue");(第一个参数可为 null)
安全读取字段值(Field.get)
与 set() 对应,用 field.get(instance) 获取值。同样需要 setAccessible(true),且对 static 字段也传 null:
立即学习“Java免费学习笔记(深入)”;
Object val = field.get(instance); // 返回 Object,按需强转int i = field.getInt(instance); // 更高效,避免装箱(仅限基本类型)String s = (String) field.get(instance); // 强转前建议检查类型或用 getXXX() 方法
常见陷阱与注意事项
反射操作容易出错,务必注意以下几点:
- 字段名拼写错误 → 抛
NoSuchFieldException,建议配合getDeclaredFields()检查可用字段 - 未调用
setAccessible(true)→IllegalAccessException - 传入 null 实例修改非 static 字段 →
NullPointerException - 类型不匹配(如给 String 字段设 Integer)→
IllegalArgumentException - 字段被 final 修饰且已初始化 → 在 JDK 12+ 默认禁止修改,需额外绕过(不推荐)

















