在 Java 中,可以通过**反射(Reflection)**来获取类的 Field(字段)。下面按常见场景给你一个完整说明。
反射的第一步是拿到 Class 对象:
Class<?> clazz = MyClass.class;
// 或
Class<?> clazz = Class.forName("com.example.MyClass");
// 或
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getFields();
✅ 只能获取 public
✅ 包含父类 public 字段
Field field = clazz.getField("name");
Field[] fields = clazz.getDeclaredFields();
✅ 不限访问权限(private / protected / public)
❌ 不包含父类字段
Field field = clazz.getDeclaredField("age");
class Person {
private String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person p = new Person("Tom", 18);
Field ageField = Person.class.getField("age");
int age = (int) ageField.get(p);
System.out.println(age); // 18
ageField.set(p, 20);
Field nameField = Person.class.getDeclaredField("name");
// 解除私有限制
nameField.setAccessible(true);
String name = (String) nameField.get(p);
System.out.println(name); // Tom
nameField.set(p, "Jerry");
⚠️ 注意:
setAccessible(true) 可能受 Java 模块化 / SecurityManager 限制Field field = Person.class.getDeclaredField("name");
System.out.println(field.getName()); // 字段名
System.out.println(field.getType()); // 字段类型
System.out.println(Modifier.toString(field.getModifiers())); // 修饰符
class Config {
public static String VERSION = "1.0";
}
Field field = Config.class.getField("VERSION");
String version = (String) field.get(null); // 静态字段,obj 传 null
| 异常 | 原因 |
|---|---|
NoSuchFieldException |
字段不存在 |
IllegalAccessException |
未设置 setAccessible(true) |
ClassCastException |
类型转换错误 |
// 获取字段
clazz.getField(name); // public
clazz.getDeclaredField(name); // 任意访问权限
// 访问私有字段
field.setAccessible(true);
field.get(obj);
field.set(obj, value);
如果你有具体场景(如:Spring、注解处理、泛型字段、Kotlin、Android),可以告诉我,我可以给你更贴近实战的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。