上一篇
Java中遍历对象属性值通常利用反射机制,通过
Class.getDeclaredFields()获取所有字段,再使用
field.setAccessible(true)确保访问权限,最后用
field.get(obj)逐个提取属性值,需注意处理私有字段和异常。
方法1:反射(Reflection)——基础且灵活
反射是Java内置API,可直接访问类的字段(包括私有字段):
import java.lang.reflect.Field;
public class ReflectionExample {
public static void main(String[] args) throws IllegalAccessException {
Person person = new Person("小明", 25, "北京市海淀区");
// 获取所有字段(包括私有)
Field[] fields = person.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true); // 解除私有字段访问限制
String fieldName = field.getName();
Object value = field.get(person); // 获取字段值
System.out.println(fieldName + ": " + value);
}
}
}
class Person {
private String name;
private int age;
private String address;
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
输出结果:
name: 小明
age: 25
address: 北京市海淀区
注意事项:
- 性能开销:反射操作比直接访问慢,高频场景慎用。
- 安全性:需显式调用
setAccessible(true)访问私有字段。 - 封装破坏:过度使用反射可能违反面向对象设计原则。
方法2:Java Beans Introspector——适合遵循Bean规范的对象
通过java.beans包处理符合Java Bean规范(有getter方法)的对象:

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class IntrospectorExample {
public static void main(String[] args) throws IntrospectionException {
User user = new User("admin", "admin@example.com");
BeanInfo beanInfo = Introspector.getBeanInfo(user.getClass());
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : descriptors) {
if ("class".equals(pd.getName())) continue; // 跳过Class属性
try {
Object value = pd.getReadMethod().invoke(user); // 调用getter方法
System.out.println(pd.getName() + ": " + value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class User {
private String username;
private String email;
public User(String username, String email) {
this.username = username;
this.email = email;
}
// 必须提供getter方法
public String getUsername() { return username; }
public String getEmail() { return email; }
}
输出结果:
username: admin
email: admin@example.com
优势:
- 自动识别getter方法,无需处理私有字段。
- 避免直接访问字段的安全风险。
方法3:第三方库(Apache Commons BeanUtils)——简化代码
使用BeanUtils.describe()快速将对象转为Map,再遍历属性:

import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
public class BeanUtilsExample {
public static void main(String[] args) throws Exception {
Product product = new Product("手机", 5999.0, "Apple");
// 对象转Map(键为属性名,值为属性值)
Map<String, String> properties = BeanUtils.describe(product);
for (Map.Entry<String, String> entry : properties.entrySet()) {
if ("class".equals(entry.getKey())) continue; // 跳过Class属性
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
class Product {
private String name;
private Double price;
private String brand;
public Product(String name, Double price, String brand) {
this.name = name;
this.price = price;
this.brand = brand;
}
// 必须提供getter
public String getName() { return name; }
public Double getPrice() { return price; }
public String getBrand() { return brand; }
}
输出结果:
name: 手机
price: 5999.0
brand: Apple
优点:

- 代码简洁,适合快速开发。
- 支持复杂嵌套对象的处理。
关键注意事项
- 性能权衡:
- 反射和Introspector有性能损耗,高频场景优先考虑直接调用getter。
- 第三方库可能引入依赖,需评估项目复杂度。
- 安全性:
- 反射访问私有字段时,需确保代码处于可信环境。
- 敏感数据(如密码)避免用反射暴露。
- 设计规范:
- 优先通过getter方法访问属性,符合封装原则。
- 复杂业务逻辑避免过度依赖反射。
总结场景选择
| 场景 | 推荐方法 |
|---|---|
| 动态处理未知类结构 | 反射(Reflection) |
| 符合Java Bean规范的对象 | Introspector |
| 快速开发且可引入第三方库 | Apache Commons BeanUtils |
| 高性能场景 | 手动调用getter |
引用说明:
本文代码示例基于Oracle官方Java文档[^1]和Apache Commons BeanUtils文档[^2],反射机制参考《Java核心技术卷I》[^3],Introspector设计遵循JavaBean规范标准[^4]。
[^1]: Oracle Java Reflection Tutorial.
[^2]: Apache Commons BeanUtils Documentation.
[^3]: Cay S. Horstmann, Core Java Volume I: Fundamentals.
[^4]: JavaBeans Specification (Oracle).
