java反射获取对象属性名和值需用getdeclaredfields()获取所有声明字段,设setaccessible(true)绕过private限制,过滤synthetic和static字段后,通过field.getname()和field.get(obj)提取键值对。

Java 中通过反射机制动态获取对象的属性名和属性值,核心是利用 Class 对象获取其声明的字段(Field),再通过设置访问权限(绕过 private 限制)读取对应值。
获取所有声明的字段(含 private)
使用 getDeclaredFields() 可以拿到当前类中定义的所有字段(不包括继承的),无论访问修饰符如何。注意它不会自动获取父类字段,如需全部字段需递归向上遍历父类。
- 调用
clazz.getDeclaredFields()返回Field[] - 对每个
Field调用setAccessible(true)才能读取 private 字段值 - 避免在循环中重复调用
setAccessible(true),可统一处理
获取字段名和当前对象的值
字段名通过 field.getName() 直接获得;字段值则需用 field.get(obj),其中 obj 是目标实例。该方法返回 Object 类型,原始类型会自动装箱(如 int → Integer)。
- 若字段为 static,
field.get(null)即可获取静态值 - 若字段类型是基本类型且值为 null(如未初始化的 int 字段),实际会返回默认值(0、false 等),不是 null
- 若字段值为 null(引用类型),
field.get(obj)返回 null,需判空避免 NPE
跳过 synthetic 字段和静态字段(按需过滤)
编译器自动生成的字段(如枚举的 $VALUES、内部类的 this$0)带有 isSynthetic() 标记;静态字段可通过 Modifier.isStatic(field.getModifiers()) 判断。实际业务中常需排除这两类。
- 用
field.isSynthetic()过滤掉编译器生成字段 - 用
Modifier.isStatic(field.getModifiers())排除 static 字段 - 也可结合
field.getType().isPrimitive()或field.getType() == String.class做类型筛选
完整示例代码片段
以下是一个安全读取非静态、非 synthetic 字段名与值的典型写法:
public static Map<string object> getFields(Object obj) {
Map<string object> map = new LinkedHashMap();
Class> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isSynthetic() || Modifier.isStatic(field.getModifiers())) continue;
field.setAccessible(true);
try {
map.put(field.getName(), field.get(obj));
} catch (IllegalAccessException e) {
// 忽略无法访问的字段,或记录日志
}
}
return map;
}
</string></string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











