Java Field如何访问
在 Java 中,Field(字段) 的访问方式取决于你是直接访问还是通过反射访问。下面分情况说明,并给出示例。
一、直接访问 Field(最常见)
1️⃣ 访问规则
| 修饰符 | 类内 | 同包 | 子类 | 任意 |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| 默认(无修饰符) | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
2️⃣ 示例
public class Person {
public String name;
private int age;
public void show() {
System.out.println(name); // 类内直接访问
}
}
Person p = new Person();
p.name = "Tom"; // public 字段
// p.age = 10; // ❌ private 不能直接访问
二、通过 getter / setter 访问(推荐)
✅ 最佳实践:字段一般设为 private,通过方法访问。
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person p = new Person();
p.setAge(18);
System.out.println(p.getAge());
三、使用反射访问 Field(重点)
1️⃣ 获取 Field 的方式
Class> clazz = Person.class;
Field field = clazz.getDeclaredField("age");
| 方法 | 说明 |
|---|---|
getField(name) |
只能获取 public 字段 |
getDeclaredField(name) |
可获取任意字段(包括 private) |
2️⃣ 访问 private Field
Person p = new Person();
Field field = Person.class.getDeclaredField("age");
field.setAccessible(true); // 解除私有限制
field.set(p, 20);
int age = (int) field.get(p);
System.out.println(age);
✅ 关键点:
setAccessible(true)是访问 private 字段的必须步骤- 反射会破坏封装性,慎用
四、静态 Field 的访问
public class Constants {
public static int MAX = 100;
}
int max = Constants.MAX;
// 反射方式
Field f = Constants.class.getField("MAX");
int value = (int) f.get(null); // 静态字段,obj 传 null
五、常见错误
❌ 访问 private 字段未 setAccessible
❌ 类型转换错误
❌ 字段名拼写错误
❌ 在非法访问权限下直接访问
六、总结
✅ 普通访问:直接访问或 getter/setter
✅ 反射访问:getDeclaredField + setAccessible
✅ 静态字段:get(null)
如果你有具体场景(如 Spring、注解、序列化、动态代理),可以告诉我,我可以结合场景详细讲。