java反射如何调用指定的属性

通过Field类获取属性并调用setAccessible(true)可操作私有字段,使用get()和set()读写值,需处理异常。

Java反射调用指定属性主要通过 java.lang.reflect.Field 类实现。你可以获取私有或公有字段,并读取或修改其值,即使字段是私有的也可以操作,前提是关闭访问检查。

1. 获取指定属性(Field)

使用 Class 对象的 getField()getDeclaredField() 方法来获取属性对象:

  • getField(String name):只能获取公共(public)属性,包括继承的。
  • getDeclaredField(String name):获取本类中声明的任意访问级别的属性(包括 private),但不包括继承的。
Class clazz = Person.class;
Field nameField = clazz.getDeclaredField("name"); // 获取私有字段 name

2. 访问私有属性(设置可访问)

如果属性是 private,需要调用 setAccessible(true) 来关闭访问安全检查。

nameField.setAccessible(true);

3. 读取和修改属性值

通过 Field 提供的 get()set() 方法操作实例的属性值:

  • get(Object obj):获取 obj 实例中该字段的值。
  • set(Object obj, Object value):为 obj 实例的该字段赋值。
Person person = new Person();
nameField.set(person, "张三");     // 设置字段值
Object value = nameField.get(person); // 获取字段值
System.out.println(value);        // 输出:张三

完整示例

假设有一个 Person 类:

class Person {
    private String name;
    
    public Person() {}
}

使用反射设置并读取 name 属性:

Person person = new Person();
Class clazz = person.getClass();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);

field.set(person, "李四");
System.out.println(field.get(person)); // 输出:李四

基本上就这些。只要拿到 Field 对象,控制访问权限,就可以自由读写属性值,不受 private 限制。注意处理 NoSuchFieldException 和 IllegalAccessException 异常。不复杂但容易忽略 setAccessible。