今天重写一个类的方法时,里面涉及到了其私有变量的值的改动,但是在子类中无法直接访问到父类的私有属性,于是便想到了利用反射来实现。
核心方法时通过 x.class.getDeclaredField 方法获取打 field 对象,然后通过该对象的 get 方法获取到值, set 方法设置值。下面是一个例子

public class Student {

    private String name;

    public Student(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }

    public static void main(String[] args) {
        Student student = new Student("张三");
        System.out.println(student);  //张三

        try {
            Field field = Student.class.getDeclaredField("name");
            field.setAccessible(true);  //设置访问性

            String name = (String) field.get(student);  //获取该变量值
            System.out.println("name = " + name); //张三

            field.set(student, "李四");  //通过这一句修改私有变量值
            field.setAccessible(false);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }

        System.out.println(student);
    }
}

输出

Student{name=’张三’}
name = 张三
Student{name=’李四’}

参考文章

 
  转自:https://www.jianshu.com/p/db2e6beea2c6