反射修改字段
咱们从最简单的例子到难, 一步一步深入.
使用反射修改一个private修饰符的变量name
咱们回到主题, 先用反射来实现一个最基础的功能吧.
其中待获取的name如下:
public class Pojo {
private StringBuilder name = new StringBuilder("default");
public void printName() {
System.out.println(name);
}
}
接下来咱们 使用反射来修改上面name的值.
为什么要用反射呢? 因为成员变量name是private修饰的, 而且没有提供一个setter方法.没有方法可以设置name的值.
虽然没有一个对外开放的接口, 但是反射却可以轻而易举地做到:
Pojo p = new Pojo();
// 查看被修改之前的值
p.printName();
// 反射获取字段, name成员变量
Field nameField = p.getClass().getDeclaredField("name");
// 由于name成员变量是private, 所以需要进行访问权限设定
nameField.setAccessible(true);
// 使用反射进行赋值
nameField.set(p, new StringBuilder("111"));
// 打印查看被修改后的值
p.printName();
发现被修改成功, 结果如下:
使用反射修改一个final修饰符的变量name
刚才使用反射成功修改了private修饰的变量, 那么如果是final修饰的变量那么还能否使用反射来进行修改呢? (因为正常的setter getter操作反正是做不到.)
声明一个final修饰的name如下. 接下来使用反射来对它进行修改. 目的也就是使name指向一个新的StringBuilder对象.
public class Pojo2 {
private final StringBuilder name = new StringBuilder("default2");
public void printName() {
System.out.println(name);
}
}
咱们看看反射的威力吧, 它能修改final的字段的指向.也就是让name字段指向一个新的地址.
Pojo2 p = new Pojo2();
// 查看被修改之前的值
p.printName();
// 反射获取字段, name成员变量
Field nameField = p.getClass().getDeclaredField("name");
// 由于name成员变量是private, 所以需要进行访问权限设定
nameField.setAccessible(true);
//