Java中Object类本身不提供直接操作属性的方法,但作为所有类的父类,配合反射可动态访问修改属性;需通过obj.getClass()获取真实Class,用getDeclaredField()定位字段并setAccessible(true),再用field.set()赋值,注意类型兼容性、继承字段查找及泛型擦除问题。

Java 中 Object 类本身不提供直接操作属性的方法,但它是所有类的父类,因此任何对象都可被当作 Object 引用;配合反射(Reflection),就能在运行时动态访问和修改其属性——关键不在 Object,而在通过 Class 获取具体类型的结构信息。
获取目标对象的 Class 和字段信息
要对一个对象动态赋值,必须先知道它的实际类型(不能只靠 Object),再通过反射定位字段。例如:
- 调用
obj.getClass()获取真实Class对象,而非Object.class - 用
getDeclaredField("fieldName")获取私有字段(需配合setAccessible(true)) - 若字段是 public,也可用
getField(),但通常不推荐依赖 public 字段设计
绕过访问控制并设置字段值
Java 反射默认受封装限制,给私有字段赋值前必须解除检查:
- 调用
field.setAccessible(true)禁用 Java 语言访问检查 - 使用
field.set(obj, value)向指定对象实例写入值 - 注意:value 类型需与字段类型兼容,否则抛
IllegalArgumentException - 若字段是基本类型(如
int),传Integer会自动拆箱;但传null给基本类型字段会报错
处理继承字段与泛型擦除的注意事项
反射操作字段时容易忽略继承和类型擦除问题:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
getDeclaredField()只查当前类声明的字段,父类字段需用getSuperclass().getDeclaredField()逐层向上找 - 泛型信息在运行时已擦除,
Field.getGenericType()可获取带泛型的类型(如List<String>),但实际赋值仍按原始类型(List)处理 - 若字段是 final 修饰的,JDK 12+ 默认禁止修改(可通过 Unsafe 或设置
modifiers字段绕过,但属高危操作,不建议生产使用)
封装成通用工具方法示例
以下是一个安全、可复用的动态赋值工具片段(省略异常处理):
<font size="2"><pre class="brush:php;toolbar:false;">public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
Class<?> clazz = obj.getClass();
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, value);
}
调用时传入任意对象(如 new User())、字段名和值即可,无需关心它是否继承自 Object —— 因为反射操作的是具体类的结构,Object 只是统一的引用入口。

















