直接访问(编译时已知属性)
如果属性是 public 的,可以直接通过 访问:
public class Person {
public String name;
public int age;
}
Person person = new Person();
person.name = "Alice"; // 设置值
String name = person.name; // 获取值
适用场景:代码中明确知道类结构,且属性是 public 的。
通过 Getter/Setter 方法(推荐)
这是 Java 的标准做法(遵循封装原则):
public class Person {
private String name;
private int age;
// Getter
public String getName() { return name; }
public int getAge() { return age; }
// Setter
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
}
Person person = new Person();
person.setName("Bob"); // 设置值
String name = person.getName(); // 获取值
适用场景:大多数业务开发,尤其是需要封装逻辑或验证时。
通过反射(运行时动态访问)
如果属性名在运行时才知道,可以使用反射:
import java.lang.reflect.Field;
public class Person {
private String name;
public int age;
}
// 获取字段值
Field nameField = Person.class.getDeclaredField("name"); // 可能需要设置可访问
nameField.setAccessible(true); // 允许访问私有字段
String name = (String) nameField.get(person); // 获取值
Field ageField = Person.class.getField("age"); // 只能访问 public 字段
int age = ageField.getInt(person); // 获取值
适用场景:框架开发、动态代理、序列化/反序列化等需要运行时操作的场景。
通过 JavaBean 规范(如 PropertyDescriptor)
结合反射和 JavaBean 规范动态调用 Getter/Setter:
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
PropertyDescriptor pd = new PropertyDescriptor("name", Person.class);
Method getter = pd.getReadMethod(); // 获取 getName()
String name = (String) getter.invoke(person); // 调用方法
适用场景:需要动态操作对象属性但不想直接处理反射细节时。
通过第三方库(如 Apache Commons BeanUtils)
简化反射操作:
import org.apache.commons.beanutils.BeanUtils; // 设置值 BeanUtils.setProperty(person, "name", "Charlie"); // 获取值 String name = BeanUtils.getProperty(person, "name");
依赖:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
适用场景:需要简化反射代码,但注意性能开销。
通过 JSON 库(如 Jackson/Gson)
适用于对象与 JSON 互转的场景:
import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(person); // 对象转 JSON Person newPerson = mapper.readValue(json, Person.class); // JSON 转对象
适用场景:API 开发、数据序列化等。
| 方式 | 适用场景 | 特点 |
|---|---|---|
| 直接访问 | public 属性,明确类结构 |
简单直接,破坏封装 |
| Getter/Setter | 标准业务开发 | 封装性好,推荐使用 |
| 反射 | 运行时动态操作 | 灵活但性能低,需处理异常 |
PropertyDescriptor |
动态调用 Getter/Setter | 比反射更安全 |
| 第三方库 | 简化反射代码 | 依赖外部库,性能开销 |
| JSON 库 | 序列化/反序列化 | 适合数据交换 |
推荐:优先使用 Getter/Setter,仅在特殊场景(如框架开发)使用反射或第三方库。
