在 Java 中,可以通过 反射(Reflection) 来操作类的 Field(字段),包括获取字段信息、读取字段值、设置字段值,甚至访问 private 字段。
下面从基础到常见用法给你一个完整说明。
要使用反射,第一步是拿到 Class 对象:
Class<?> clazz = MyClass.class;
// 或
Class<?> clazz = Class.forName("com.example.MyClass");
// 或
Class<?> clazz = obj.getClass();
Field field = clazz.getDeclaredField("name");
Field[] fields = clazz.getDeclaredFields(); // 本类所有字段
Field[] fields2 = clazz.getFields(); // 公共字段(含父类)
如果是 private 字段,必须设置:
field.setAccessible(true);
MyClass obj = new MyClass();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
Object value = field.get(obj);
System.out.println(value);
如果是 static 字段:
Object value = field.get(null);
field.set(obj, "张三");
static 字段:
field.set(null, "静态值");
field.getName(); // 字段名
field.getType(); // 字段类型
field.getModifiers(); // 修饰符(public/private/static...)
判断是否 private:
Modifier.isPrivate(field.getModifiers());
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
User user = new User("Tom", 18);
Class<?> clazz = user.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
System.out.println(field.getName() + " = " + field.get(user));
}
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "Jerry");
System.out.println(nameField.get(user));
}
}
--add-opens java.base/java.lang=ALL-UNNAMED
如果你有具体场景(比如:
可以直接说,我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。