如何获取Java Field
在 Java 中,**获取 Field(字段)通常是通过反射(Reflection)**来实现的。下面从常见用法到注意事项给你一个完整说明。
一、获取 Field 的常见方式
1️⃣ 获取所有字段
获取当前类声明的字段(不包含父类)
Class> clazz = MyClass.class;
Field[] fields = clazz.getDeclaredFields();
获取所有 public 字段(包括父类)
Field[] fields = clazz.getFields();
2️⃣ 获取指定字段
获取当前类中声明的字段(推荐)
Field field = clazz.getDeclaredField("name");
获取 public 字段(包括父类)
Field field = clazz.getField("name");
⚠️ 如果字段不存在,会抛:
NoSuchFieldException
二、访问字段的值
1️⃣ 设置可访问(非常重要)
如果是 private / protected,必须先设置:
field.setAccessible(true);
否则会抛:
IllegalAccessException
2️⃣ 读取字段值
Object value = field.get(obj);
示例:
MyClass obj = new MyClass();
Field field = obj.getClass().getDeclaredField("name");
field.setAccessible(true);
String name = (String) field.get(obj);
3️⃣ 修改字段值
field.set(obj, newValue);
示例:
field.set(obj, "newName");
三、获取字段类型、修饰符等信息
Class> type = field.getType(); // 字段类型
int modifiers = field.getModifiers(); // 修饰符
判断修饰符:
Modifier.isPrivate(modifiers);
Modifier.isStatic(modifiers);
Modifier.isFinal(modifiers);
四、静态字段的访问
Field field = MyClass.class.getDeclaredField("STATIC_FIELD");
field.setAccessible(true);
Object value = field.get(null); // 静态字段,传 null
五、常见示例(完整)
class Person {
private String name;
public int age;
}
public class Test {
public static void main(String[] args) throws Exception {
Person p = new Person();
Field nameField = p.getClass().getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(p, "Tom");
System.out.println(nameField.get(p));
}
}
六、注意事项(非常重要)
✅ 性能问题
反射比直接访问慢,避免在高频场景使用。
✅ 安全问题setAccessible(true) 会绕过访问控制。
✅ Java 9+ 模块系统
如果字段在模块中未开放,可能抛:
InaccessibleObjectException
✅ final 字段
修改 final 字段在多数情况下不推荐,可能导致未定义行为。
七、什么时候用 Field 反射?
✅ 通用工具(ORM、序列化、JSON 转换)
✅ 框架开发
✅ 动态配置
❌ 普通业务代码(不推荐)
如果你有具体场景(比如 Spring、Jackson、MyBatis、注解处理),我可以给你更针对性的示例。