今天重写一个类的方法时,里面涉及到了其私有变量的值的改动,但是在子类中无法直接访问到父类的私有属性,于是便想到了利用反射来实现。
核心方法时通过 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