在 Java 中,Field(字段) 的访问方式取决于你是直接访问还是通过反射访问。下面分情况说明,并给出示例。
| 修饰符 | 类内 | 同包 | 子类 | 任意 |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| 默认(无修饰符) | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
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 不能直接访问
✅ 最佳实践:字段一般设为 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());
Class<?> clazz = Person.class;
Field field = clazz.getDeclaredField("age");
| 方法 | 说明 |
|---|---|
getField(name) |
只能获取 public 字段 |
getDeclaredField(name) |
可获取任意字段(包括 private) |
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 字段的必须步骤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、注解、序列化、动态代理),可以告诉我,我可以结合场景详细讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。