杰瑞科技汇

Java对象如何获取属性值?

直接访问(编译时已知属性)

如果属性是 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,仅在特殊场景(如框架开发)使用反射或第三方库。

分享:
扫描分享到社交APP
上一篇
下一篇