java修改字段修饰符_Java反射-修改字段值, 反射修改static final修饰的字段

反射修改字段

咱们从最简单的例子到难, 一步一步深入.

使用反射修改一个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();

发现被修改成功, 结果如下:

09f9893edeb1a0552204c2b3ac2447ca.png

使用反射修改一个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);

//

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值