java反射操作成员变量核心是field对象:先获取(getfield/getdeclaredfield)、再调setaccessible(true)解除限制、最后get/set值;需区分public字段与任意声明字段,注意静态/实例字段调用差异及类型匹配,异常须捕获处理。

Java反射中操作成员变量,核心就是围绕Field对象展开:先拿到它,再解除限制,最后读或写值。整个流程不依赖编译期可见性,连private字段也能动态访问。
获取Field对象的两种方式
根据字段访问权限和是否继承,选择合适的方法:
-
只取public字段(含父类继承的):用
getField("fieldName")或getFields();若字段不存在或非public,会抛NoSuchFieldException -
获取任意声明字段(含private/protected,不含继承):必须用
getDeclaredField("fieldName")或getDeclaredFields();这是操作私有属性的唯一入口
必须调用setAccessible(true)
哪怕拿到了private字段的Field对象,直接get()或set()仍会触发IllegalAccessException。关键一步是:
field.setAccessible(true);
这行代码绕过Java语言访问控制检查,仅影响当前Field实例,不影响其他反射行为或运行时安全策略。
读取与修改字段值
值操作分三类场景,注意参数差异:
-
实例字段:
field.get(obj)和field.set(obj, newValue),obj必须是非null的对象实例 -
静态字段:
field.get(null)和field.set(null, newValue),第一个参数固定为null -
类型匹配:传入值需与字段声明类型兼容,否则抛
IllegalArgumentException;读取后通常需强制转型,如(String) field.get(obj)
异常处理不可省略
反射操作字段常见异常有三个,建议统一捕获处理:
-
NoSuchFieldException:字段名拼错、大小写不符、或该字段根本不存在于目标类中 -
IllegalAccessException:忘了调setAccessible(true),或JDK 12+启用了强封装限制(需加启动参数) -
IllegalArgumentException:赋值类型不匹配,比如往int字段塞String










