在 Java 中,**获取 Field(字段)通常是通过反射(Reflection)**来实现的。下面从常见用法到注意事项给你一个完整说明。
Field 的常见方式Class<?> clazz = MyClass.class;
Field[] fields = clazz.getDeclaredFields();
public 字段(包括父类)Field[] fields = clazz.getFields();
Field field = clazz.getDeclaredField("name");
Field field = clazz.getField("name");
⚠️ 如果字段不存在,会抛:
NoSuchFieldException
如果是 private / protected,必须先设置:
field.setAccessible(true);
否则会抛:
IllegalAccessException
Object value = field.get(obj);
示例:
MyClass obj = new MyClass();
Field field = obj.getClass().getDeclaredField("name");
field.setAccessible(true);
String name = (String) field.get(obj);
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 字段在多数情况下不推荐,可能导致未定义行为。
✅ 通用工具(ORM、序列化、JSON 转换)
✅ 框架开发
✅ 动态配置
❌ 普通业务代码(不推荐)
如果你有具体场景(比如 Spring、Jackson、MyBatis、注解处理),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。